仅在stdin完成时输出到stdout

时间:2016-03-16 15:07:21

标签: linux bash pipe stdout stdin

等待stdin完成向stdout输出内容的最简单命令是什么。

例如,如果我写:

{
echo "foo"
sleep 1
echo "bar"
} | command

它应该显示

foo
bar

1秒后(而不是开头的第一个foo)。

到目前为止,我的解决方案是执行两次tac,例如:

{
echo "foo"
sleep 1
echo "bar"
} | tac | tac

它具有很好地处理所有ANSI转义/颜色的优点。

他们是否有任何更简单的方式来做我想要的事情?

4 个答案:

答案 0 :(得分:1)

最简单的方法是

{
 echo "foo";
 sleep 1;
 echo "bar";
} > /dev/shm/file.$$; cat /dev/shm/file.$$

答案 1 :(得分:1)

使用bashims的替代方案:

cat <<EOF
$(
  echo foo
  sleep 3
  echo bar
)
EOF

# or
cat <<<"$(echo foo;sleep 3;echo bar)"

内部bash将创建一个safe temporary file,将命令的输出放入其中,然后将其传递给cat stdin。 一旦命令(此处为cat)释放stdin,该文件就会被销毁。

注意通常最好使用流。

答案 2 :(得分:0)

执行此操作的一种方法是使用printf命令:

例如

{
echo "foo"
sleep 1
echo "bar"
} | printf "%s\n" "$(cat)"

会做的伎俩

答案 3 :(得分:0)

捕获输出,然后回显/打印它:

output=$(
    echo "foo"
    sleep 1
    echo "bar"
) 
printf "%s\n" "$output"

或者只是:

printf "%s\n" "$(
    echo "foo"
    sleep 1
    echo "bar"
)"