使用tee和过程替换会产生奇怪的结果

时间:2014-11-06 06:15:33

标签: bash unix

请查看以下命令:

   ===> echo "hi" | tee >(sed -e 's/hi/wow/') | tail | perl -pe 's/hi/janet/;print "holy\n"'
holy
janet
holy
wow

为什么holy会在这里打印两次?

我期待结果是

holy
janet
wow

1 个答案:

答案 0 :(得分:1)

我们可以将您的代码提炼为更简单的形式:

(echo hi; echo wow) | perl -pe 'print "holy\n"'

现在,这会将两行提供给perl,其-p选项的意思是“Read lines from stdin and print them also”。我们也告诉Perl打印“神圣”。因此,对于每个输入行,我们打印“神圣”然后输入行,因此两行变为四行并不奇怪。可能你的惊喜源于没有意识到-p的机制 - 它表现得好像你的整个脚本被放在所有输入行的循环中。