带后台进程的 YAD 多进度条 (bash)
YAD multi-progress bar with background processes (bash)
我正在尝试将多个脚本通过管道传输到 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)。
问题是退出状态总是 returns 0。感谢任何正确方向的帮助:)
您的脚本中存在一些不同的问题:
()
打开一个子shell,所以你的$Y
和$X
变量定义在一个子shell中,不能被看到parent shell.
- 在使用
&
将 Script1
发送到后台后,其输出未被 YAD 的管道捕获。
- 调用
wait
在您的情况下是无用的,因为通过在 subshell 内部设置背景 Script2
而不是设置 subshell 本身,subshell 将在退出前等待所有后台进程完成,因此当您到达 wait
时,一切都已完成。
你可以做什么:我假设Script1
和Script2
知道输出他们的进度条数字(否则会有一点sed
涉及)所以你只想将它们的输出交错到 YAD 的管道中 - 所以你想 运行 它们在相同的子 shell 和背景下:
(./Script1 & ./Script2 & wait ) | yad ...
所以这会给你一些不错的进度条,但你也想捕获脚本退出代码并将它们传输出 shell。为此,您需要另一种机制:您不能使用 shell 变量 - 因为这些变量不会传播出 subshell,并且您不能使用退出代码,因为 subshell 只有一个退出代码(它也被管道吃掉了,但如果没有第一个问题就可以解决)。你最好的选择是一个临时文件,所以像这样:
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
我正在尝试将多个脚本通过管道传输到 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)。 问题是退出状态总是 returns 0。感谢任何正确方向的帮助:)
您的脚本中存在一些不同的问题:
()
打开一个子shell,所以你的$Y
和$X
变量定义在一个子shell中,不能被看到parent shell.- 在使用
&
将Script1
发送到后台后,其输出未被 YAD 的管道捕获。 - 调用
wait
在您的情况下是无用的,因为通过在 subshell 内部设置背景Script2
而不是设置 subshell 本身,subshell 将在退出前等待所有后台进程完成,因此当您到达wait
时,一切都已完成。
你可以做什么:我假设Script1
和Script2
知道输出他们的进度条数字(否则会有一点sed
涉及)所以你只想将它们的输出交错到 YAD 的管道中 - 所以你想 运行 它们在相同的子 shell 和背景下:
(./Script1 & ./Script2 & wait ) | yad ...
所以这会给你一些不错的进度条,但你也想捕获脚本退出代码并将它们传输出 shell。为此,您需要另一种机制:您不能使用 shell 变量 - 因为这些变量不会传播出 subshell,并且您不能使用退出代码,因为 subshell 只有一个退出代码(它也被管道吃掉了,但如果没有第一个问题就可以解决)。你最好的选择是一个临时文件,所以像这样:
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