gpt4 book ai didi

linux - 带有后台进程的 YAD 多进度条 (bash)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:35:25 24 4
gpt4 key购买 nike

我正在尝试将多个脚本通过管道传输到 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. () 打开一个子 shell,所以你的 $Y$X 变量在子 shell 中定义并且不能被看到父外壳。
  2. 在使用 &Script1 发送到后台后,它的输出没有被管道捕获到 YAD。
  3. 调用 wait 在您的情况下是无用的,因为通过在子 shell 中后台处理 Script2 而不是在后台处理子 shell 本身,子 shell 将在退出之前等待所有后台进程完成,所以当您到达 wait 时,一切都已经完成。

可以做什么:我假设 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

关于linux - 带有后台进程的 YAD 多进度条 (bash),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49809236/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com