您的脚本中有几个不同的问题:
()
打开一个子shell,因此您的$Y
和$X
变量在子shell中定义,父shell看不到。
- 用于
&
发送Script1
到后台后,其输出不会被管道捕获到 YAD。
- 在您的情况下,调用
wait
是无用的,因为通过Script2
在子shell 内进行后台处理而不是对子shell 本身进行后台处理,子shell 将在退出之前等待所有后台进程完成,因此当您完成wait
所有操作时。
你能做什么:我假设Script1
并且Script2
知道输出他们的进度条数字(否则会有一点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