【发布时间】:2013-03-07 08:25:28
【问题描述】:
我正在 bash 脚本中显示命令进度。命令输出通过管道传送到 zenity --progress 并最终可以运行很长时间。如果我取消 zenity 对话框,我想中止它(杀死该命令):
( echo 0; command; echo 100 ) | if ! zenity --progress
then DO_SOMETHING_TO_KILL_command
fi
我找到的所有解决方案:
一般用 pgrep、pidof、pkill、killall 等杀死“命令”。这不是我想要的,因为可能有很多这样的“命令”在运行。
创建一个fifo来输出“command”的PID(command & echo $!>some_fifo;wait),然后在管道之后从中读取。
解决方案 2. 做我想要的,但是以一种过于复杂的方式(参见例如一个例子 here(法语))。如果可能,我想避免使用 fifos 或临时文件。似乎最多可以通过将输出重定向到文件描述符来完成,但我不知道具体如何。
注意:使用重定向替换整个组的命令,例如 $( ( ... command& echo >&3 ... | zenity --progress ) 3>&1 ) - 这是这种类型的通用解决方案-- 在这里不起作用,因为 $(...) 会等到整个子 shell 完成。
【问题讨论】:
-
只有在我们运行 'zenity --progress --pulsate' 的情况下才需要'echo 0';当 'command' 不输出数字时,通常这样看起来更好。