我想编写一个 bash 脚本,用于使用 dvdbackup 翻录大量 DVD 集。并行使用四个 DVD 驱动器,dvdbackup 的终端输出会混合在一起。
dvdbackup -Mv --progress --error=a -i /dev/sr0 -o /home/xxxx/vids/ &
dvdbackup -Mv --progress --error=a -i /dev/sr1 -o /home/xxxx/vids/
我需要终端输出来控制可能的错误。我该如何控制输出?对于这个问题,我很难在谷歌上找到匹配的搜索词...
提前致谢
答案1
使用GNU 并行你可以做:
parallel --line-buffer --tag 'dvdbackup -Mv --progress --error=a -i /dev/{1} -o /home/xxxx/vids/' ::: sr0 sr1
从它的手册来看:
--tag
带参数的标记行。每个输出行都将添加参数和制表符 (\t)。
答案2
你不能。这些程序是并行运行的,因此它们同时写入终端。您可以做的是将每个实例的标准错误捕获到一个单独的文件中:
dvdbackup -Mv --progress --error=a -i /dev/sr0 -o /home/xxxx/vids/ 2>log1 &
dvdbackup -Mv --progress --error=a -i /dev/sr1 -o /home/xxxx/vids/ 2>log2
dvdbackup
然后,您将获得第一个命令的错误/进度报告等log1
以及第二个命令的错误/进度报告等log2
。
或者,如果您只想向其错误输出添加标签,您可以这样做:
dvdbackup -Mv --progress --error=a -i /dev/sr0 -o vids/ 3>&1 1>&2 2>&3 |
sed 's/^/Process A /' &
dvdbackup -Mv --progress --error=a -i /dev/sr1 -o vids/ 3>&1 1>&2 2>&3 |
sed 's/^/Process B /'
这会将字符串添加Process A
到第一个进程打印到 stderr 的每行的开头,以及Process B
打印到第二个进程的 stderr 的每行的开头。
例如:
$ seq 1 5 | sed 's/^/process A /' & seq 1 5 | sed 's/^/process B /'
[1] 1549053
process A 1
process A 2
process A 3
process A 4
process A 5
process B 1
process B 2
process B 3
process B 4
process B 5
[1]+ Done seq 1 5 | sed 's/^/process A /'