重定向到屏幕和管道

时间:2011-09-10 16:21:39

标签: bash

我想将一些输出传递给另一个程序并显示一个进度条。

代码看起来像这样:

echo "Progress:"
(for i in {1..10}; do echo $i; echo "." > screen; sleep 1; done) | xargs echo

其中screen会将其指向屏幕。这不起作用,因为它只会将点写入文件屏幕。

我想要做的是输出“。”当脚本正在运行并且最后一次管道所有echo "$i"时,所以只发生一个管道。

6 个答案:

答案 0 :(得分:3)

您必须将回声发送到tty设备。例如,echo'thing'>的/ dev / TTY

但如果你只想在屏幕上显示点,则不需要任何重定向。只回显'。'

答案 1 :(得分:2)

尝试使用/ dev / stderr将内容写入屏幕

E.g。这样的事情应该做到。

echo "Progress:"
(for i in {1..10}; do echo $i; echo -n "." | tee /dev/stderr ; sleep 1; done)

答案 2 :(得分:1)

您可以使用tee

答案 3 :(得分:1)

如果您只想要一个进度指示器,pv怎么样?

答案 4 :(得分:1)

如果要复制到标准输出和文件tee命令是您的朋友。如果要将其传递给另一个命令而不是文件,可以将文件/dev/tty(即屏幕)和管道标准输出传输到另一个程序。

答案 5 :(得分:1)

我喜欢pv输出。它类似于wget显示它的进展。

ubuntu@ubuntu:~$ dd if=/dev/urandom bs=1M count=100 | pv | cat >/dev/null
  14MB 0:00:03 [4,84MB/s] [  <=>                                              ]

如果您知道要传输的数据大小,可以指定pv -s它甚至可以显示估算值:

ubuntu@ubuntu:~$ dd if=/dev/urandom bs=1M count=100 | pv -s 100M | cat >/dev/null
  14MB 0:00:03 [4,84MB/s] [===>                               ] 14% ETA 0:00:18