等待stdin完成向stdout输出内容的最简单命令是什么。
例如,如果我写:
{
echo "foo"
sleep 1
echo "bar"
} | command
它应该显示
foo
bar
1秒后(而不是开头的第一个foo)。
到目前为止,我的解决方案是执行两次tac
,例如:
{
echo "foo"
sleep 1
echo "bar"
} | tac | tac
它具有很好地处理所有ANSI转义/颜色的优点。
他们是否有任何更简单的方式来做我想要的事情?
答案 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"
)"