使用管道和herestring时为什么会出现意外结果?

时间:2017-06-13 15:38:38

标签: bash

当尝试将命令的输出传递到另一个命令时,并且还从herestring读取第二个命令时,我没有得到我期望的结果。例如:

echo "a" | grep -f - <<<abc

我希望产生输出

abc

但我没有得到任何东西

1 个答案:

答案 0 :(得分:4)

管道和herestring都试图成为stdin第二个命令,grep。在其上使用strace表示在这种情况下,只有herestring实际上可用于grep。然后它会得到一个空的&#34;文件&#34;搜索,找不到匹配项。当搜索空间是文件而不是字符串时,这是strace的一部分:

read(0, "a\n", 4096)    = 2
read(0, "", 4096)       = 0
<snip>
read(3, "abc\n", 32768) = 4
read(3, "", 32768)      = 0

但是使用herestring我们会看到:

read(0, "abc\n", 4096)  = 4
read(0, "", 4096)       = 0
<snip>
read(0, "", 32768)      = 0

所以我们从来没有读过我们期望成为模式空间的管道中的值。

使用进程替换确实解决了这个问题,因为模式空间或搜索空间不是来自文件句柄0:

echo "a" | grep -f - <(echo "abc")
例如,

生成已执行的abc输出