YAD多进度条与后台进程(bash)

时间:2018-04-13 04:18:52

标签: 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 returned $?"

另外两个脚本只是回显他们的进度并以状态退出(如果失败则为1)。 问题是退出状态总是返回0.正确方向的任何帮助都值得赞赏:)

1 个答案:

答案 0 :(得分:1)

您的脚本中存在一些不同的问题:

  1. ()打开一个子shell,因此您的$Y$X变量在子shell中定义,并且父shell无法看到。
  2. 使用&Script1发送到后台后,其输出不会被管道捕获到YAD。
  3. 在你的情况下调用wait是没用的,因为通过在子shell中设置Script2并且不对子shell本身进行后台处理,子shell将在退出之前等待所有后台进程完成,所以当你到达时wait一切都已经完成。
  4. 可以做什么:我假设Script1Script2知道输出他们的进度条数字(否则会有一点点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