出乎意料的是,这失败了(没有输出;尝试过 sh , zsh , bash ):
echo "foo\nplayed\nbar" > /tmp/t && tail -f /tmp/t | grep played | sed 's#pl#st#g'
请注意, grep 两次也会失败,表明与使用哪些命令无关:
# echo -e "foo\nplayed\nbar" > /tmp/t && tail -f /tmp/t | grep played | grep played
单独运行grep :
# echo -e "foo\nplayed\nbar" > /tmp/t && tail -f /tmp/t | grep played
played
sed 单独工作:
# echo -e "foo\nplayed\nbar" > /tmp/t && tail -f /tmp/t | sed 's#pl#st#g'`
foo
stayed
bar
使用 cat 而不是 tail ,它可以正常工作:
# echo -e "foo\nplayed\nbar" > /tmp/t && cat /tmp/t | grep played | sed 's#pl#st#g'
stayed
journalctl --follow
,与tail
一样失败。
无法管道两次的原因是什么?
答案 0 :(得分:1)
这是一个缓冲问题 - 第一个grep在它输出到另一个命令时缓冲它的输出,但是如果它正在打印到stdout则不会。有关其他信息,请参阅http://mywiki.wooledge.org/BashFAQ/009。