带有后台进程 (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 returned $?"

其他两个脚本将只回显其进度并以状态退出(如果失败,则为 1)。 问题是退出状态始终返回 0。任何正确方向的帮助将不胜感激:)

脚本中有几个不同的问题:

  1. ()打开子外壳,因此$Y变量和$X变量在子外壳中定义,父外壳看不到。
  2. 使用&Script1发送到后台后,管道不会捕获其输出到 YAD。
  3. 调用wait在您的情况下是没有用的,因为通过在子外壳内后台Script2而不是在子外壳本身后台化,子外壳将等待所有后台进程完成后再退出,因此当您开始wait一切都已经完成。

你能做什么:我假设Script1Script2知道输出他们的进度条编号(否则会涉及一些sed),所以你只想在管道中交错他们的输出到 YAD - 所以你想在相同的子壳和后台运行它们:

(./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

最新更新