Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 带后台进程的YAD多进度条(bash)_Linux_Bash_Yad - Fatal编程技术网

Linux 带后台进程的YAD多进度条(bash)

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

我试图将多个脚本通过管道传输到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。任何正确方向的帮助都将不胜感激:)

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

  • ()
    打开子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。再次感谢你的帮助!