在 POSIX shell 中使用while 循环来处理文本通常被认为是不好的做法吗?
正如Stéphane Chazelas 所指出的,不使用 shell 循环的一些原因是概念、可靠性、易读性、性能和安全性。
这个答案解释了可靠性和易读性方面:
while IFS= read -r line <&3; do
printf '%s\n' "$line"
done 3< "$InputFile"
Run Code Online (Sandbox Code Playgroud)
为了性能,从文件或管道读取时,while
循环和读取非常慢,因为内置的read shell一次读取一个字符。
怎么样的概念和安全性方面?
内置命令和另一个名义上可以做同样事情的命令之间有什么内在的区别吗?
例如。内置函数是否得到“特殊”处理?...运行它们的开销是否更少?.. 或者它们只是简单地“内置”;像你汽车的仪表盘?
...是否有这些内置函数的明确(当前)列表?
我在阅读著名的Unix Recovery Legend 时,突然想到:
如果我打开了一个 BusyBox shell,并且 BusyBox 二进制文件本身被删除了,我还能使用 BusyBox 二进制文件中包含的所有命令吗?
显然,我无法从另一个正在运行的 shell 中使用这些命令的 BB 版本,例如bash
,因为 BusyBox 文件本身将无法bash
打开和运行。但是在 BusyBox 的运行实例中,在我看来,BB 可以通过两种方法运行命令:
如果 (1) 是 BusyBox 的工作方式,我希望在删除 BB 二进制文件后,某些 BusyBox 提供的命令在 BB 的运行实例中将变得不可用。
如果 (2) 是它的工作原理,那么 BusyBox 甚至可以用于恢复 BB 本身已被删除的系统——前提是仍然可以访问 BusyBox 的一个正在运行的实例。
这在任何地方都有记录吗?如果没有,有没有办法安全地测试它?
从有关的printf是否是这个问题,一个内置的佳日,谈到这个答案是报价POSIX标准。
答案指出,POSIX 搜索顺序是查找所需命令的外部实现,然后,如果 shell 已将其实现为内置,则运行内置。(对于不是特殊内置函数的内置函数。)
为什么 POSIX 要求在允许运行内部实现之前存在外部实现?
似乎……随意,所以我很好奇。
我添加了一个符号链接到当前目录ln -s . aa
。如果我执行cd aa
,然后我执行pwd
,响应是/home/sim/aa
。
但是如果我执行/bin/pwd
它会打印/home/sim
(当前目录没有改变)。
这种差异从何而来?