Linux 带后台进程的YAD多进度条(bash)
我试图将多个脚本通过管道传输到YAD多进度条中,但仍然获得子进程的退出状态。这是我到目前为止得到的 这将是我的主要剧本:Linux 带后台进程的YAD多进度条(bash),linux,bash,yad,Linux,Bash,Yad,我试图将多个脚本通过管道传输到YAD多进度条中,但仍然获得子进程的退出状态。这是我到目前为止得到的 这将是我的主要剧本: (./Script1.sh & X=$!) & (./Script2.sh & Y=$!) | yad --multi-progress \ --bar "Bar1:"NORM --bar "Bar2:"NORM wait $X echo "Script 1 returned $?" wait $Y echo "Script 2 return
(./Script1.sh & X=$!) & (./Script2.sh & Y=$!) | yad --multi-progress \
--bar "Bar1:"NORM --bar "Bar2:"NORM
wait $X
echo "Script 1 returned $?"
wait $Y
echo "Script 2 returned $?"
另外两个脚本将只响应它们的进度并以状态退出(如果失败,则为1)。
问题是退出状态始终返回0。任何正确方向的帮助都将不胜感激:)您的脚本中存在一些不同的问题:
()
打开子shell,这样您的$Y
和$X
变量在子shell中定义,并且父shell无法看到&
将Script1
发送到后台后,其输出不会被发送到YAD的管道捕获wait
是没有用的,因为通过在子shell内部回退Script2
,而不是将子shell本身回退,子shell将在退出之前等待所有回退进程完成,因此当您进入wait
时,一切都已经完成Script1
和Script2
知道输出它们的进度条编号(否则会涉及到一点sed
),所以你只想在管道中将它们的输出交错到YAD,所以你想在相同的子shell和背景下运行它们:
(./Script1 & ./Script2 & wait ) | yad ...
这将为您提供一些不错的进度条,但是您还希望捕获脚本退出代码并将它们从shell中传输出来。为此,您需要另一种机制:您不能使用shell变量——因为这些变量不会从子shell传播出去,您也不能使用退出代码,因为子shell只有一个退出代码(该代码也被管道吃掉,但如果没有第一个问题,可以解决)。您的最佳选择是临时文件,因此类似以下内容:
file=$(mktemp)
(
./Script1 & e1=$!
./Script2 & e2=$!
wait $e1; echo $? >> $file
wait $e2; echo $? >> $file
) | yad ...
e1=$(head -n1 $file | tail -n1)
e2=$(head -n2 $file | tail -n1)
rm -f $file
关于(3),这通常是可行的-您可以在子shell中对流程进行后台处理,然后退出子shell,将内部流程置于后台,但因为您将子shell传输到某个对象,管道保存子shell的
stdout
,消费程序等待子shell的stdout结束——只有当所有内部后台进程关闭其输出时,才会停止。令人敬畏的回答。谢谢你的帮助。还有一个问题,你知道为什么车场进度条上的取消按钮不返回退出代码1吗?不管发生什么,它都是0。yad进度对话框上没有“取消”按钮。有一个“Close”(关闭),它只是关闭对话框。如果您想检测取消,请考虑使用ZeNITY(即使它没有多个进展)。实际上,我刚刚添加了一个带有--button=“cancel”:1的cancel按钮,它将返回1。再次感谢你的帮助!