Tyl*_*ler 8 shell bash sed head read
以下命令似乎大致等效:
read varname
varname=$(head -1)
varname=$(sed 1q)
Run Code Online (Sandbox Code Playgroud)
一个区别是,read是内置,而壳head和sed都没有。
除此之外,三者在行为上有什么不同吗?
我的动机是更好地理解 shell 和关键实用程序(如head,sed. 例如,如果 usinghead是 的简单替代品read,那么为什么它read作为内置函数存在?
效率和内置性都不是最大的区别。对于某些输入,它们都将返回不同的输出。
head -n1 仅当输入有换行符时才提供尾随换行符。
sed 1q 将始终提供尾随换行符,否则保留输入。
read 永远不会提供尾随换行符,并将解释反斜杠序列。
此外,read还有其他选项,例如拆分、超时和输入历史记录,其中一些是标准的,而另一些则因壳而异。
一方面,您可以使用 read 解析文本,而不仅仅是取整行
echo "foo:bar:baz" | {
IFS=: read one two three
echo $two
}
Run Code Online (Sandbox Code Playgroud)
内置函数是一种让系统调用更快的方式。因此,我相信readcommand 作为内置命令存在以提高效率。
从这里引用,
这些内置命令是 shell 的一部分,并作为 shell 源代码的一部分实现。Shell 识别出要求它执行的命令是它的内置命令之一,并且它自己执行该操作,而无需调用单独的可执行文件。不同的 shell 有不同的内置函数,尽管在基本集合中会有很多重叠。
现在,我希望您自己对此进行试验,以便您了解为什么read以 shell 内置函数的形式存在。
通常,你不能strace在 shell 内置函数上做。但是,也有一种解决方法。这在这个答案中得到了很好的解释。
stty -echo.cat | strace bash >
/dev/null.strace因为它非常大。