当尝试将命令的输出传递到另一个命令时,并且还从herestring读取第二个命令时,我没有得到我期望的结果。例如:
echo "a" | grep -f - <<<abc
我希望产生输出
abc
但我没有得到任何东西
答案 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
输出