read、head -1 和 sed 1q 之间有区别吗?

Tyl*_*ler 8 shell bash sed head read

以下命令似乎大致等效:

read varname
varname=$(head -1)
varname=$(sed 1q)
Run Code Online (Sandbox Code Playgroud)

一个区别是,read是内置,而壳headsed都没有。

除此之外,三者在行为上有什么不同吗?

我的动机是更好地理解 shell 和关键实用程序(如head,sed. 例如,如果 usinghead是 的简单替代品read,那么为什么它read作为内置函数存在?

o11*_*11c 8

效率和内置性都不是最大的区别。对于某些输入,它们都将返回不同的输出。

  • head -n1 仅当输入有换行符时才提供尾随换行符。

  • sed 1q 将始终提供尾随换行符,否则保留输入。

  • read 永远不会提供尾随换行符,并将解释反斜杠序列。

此外,read还有其他选项,例如拆分、超时和输入历史记录,其中一些是标准的,而另一些则因壳而异。


gle*_*man 6

一方面,您可以使用 read 解析文本,而不仅仅是取整行

echo "foo:bar:baz" | {
  IFS=: read one two three
  echo $two
}
Run Code Online (Sandbox Code Playgroud)

  • 真的。`read` 将拆分的部分分配给变量。 (2认同)

Ram*_*esh 6

内置函数是一种让系统调用更快的方式。因此,我相信readcommand 作为内置命令存在以提高效率。

这里引用,

这些内置命令是 shell 的一部分,并作为 shell 源代码的一部分实现。Shell 识别出要求它执行的命令是它的内置命令之一,并且它自己执行该操作,而无需调用单独的可执行文件。不同的 shell 有不同的内置函数,尽管在基本集合中会有很多重叠。

现在,我希望您自己对此进行试验,以便您了解为什么read以 shell 内置函数的形式存在。

通常,你不能strace在 shell 内置函数上做。但是,也有一种解决方法。这在这个答案中得到了很好的解释。

  1. 在第一个 shell 中,将命令作为stty -echo.
  2. 打开另一个 shell 并以cat | strace bash > /dev/null.
  3. 现在,shell 将等待用户输入命令,然后当用户输入命令时,您也可以看到系统级别发生的情况。
  4. 当您给出上述 3 个命令时,您可以看到 read 比其余 2 个命令具有更少的系统调用。我没有粘贴输出,strace因为它非常大。