如果我使用GNU并行程序包装使用pv
(管道查看器(命令的命令,它似乎会丢失命令的进度输出。
例如,如果我运行以下pv
命令,它显示了我的gzip:的进度
› dd if=/dev/urandom bs=256m count=1 | (pv --progress -s 256m --bytes | gzip > /dev/null)
208MiB [=============================> ] 32%
它运行良好。但是,如果我用GNUparallel:包装相同的命令
parallel 'dd if=/dev/urandom bs={} count=1 | (pv --progress -s {} --bytes | gzip > /dev/null)' ::: 256m
我不再看到正在进行的gzip进度,而只看到最后的脚本输出。
问题:不确定是我的pv
还是parallel
出了问题,但如果我使用pv
,有没有办法显示单个命令(Unix管道(的进度(而不是parallel --progress
给出的作业进度(?
GNU并行程序将输出保存到临时文件中,并在作业完成后打印这些文件。所以它基本上是为每个命令运行这个:
(cmd; cmd) > tmp.out 2> tmp.err
cat tmp.out
cat tmp.err >&2
这就是您没有看到任何输出的原因。
可以要求GNU并行程序不使用临时文件,而只使用--line-buffer
缓冲整行。这在这里不起作用,因为pv
确实想要一个tty。
幸运的是,您还可以请求GNU并行程序将tty与--tty
连接起来。GNU Parallel假设当你连接tty时,你只想运行一个作业(即--jobs 1
(,但你可以覆盖它:
parallel -j2 --tty 'dd if=/dev/urandom bs=1 count={} | (pv --progress -s {} --bytes | gzip > /dev/null)' ::: 20M 10M