【发布时间】:2018-07-18 20:28:07
【问题描述】:
bash 如何在以下构造中等待进程替换中使用的子shell 完成? (这当然是从我使用的真正的 for 循环和 subshell 中简化的,但它很好地说明了意图。)
for i in {1..3}; do
echo "$i"
done > >(xargs -n1 bash -c 'sleep 1; echo "Subshell: $0"')
echo "Finished"
打印:
Finished
Subshell: 1
Subshell: 2
Subshell: 3
代替:
Subshell: 1
Subshell: 2
Subshell: 3
Finished
如何让 bash 等待这些子 shell 完成?
更新
使用进程替换的原因是我想使用文件描述符来控制打印到屏幕的内容以及发送到进程的内容。这是我正在做的更完整的版本:
for myFile in file1 file2 file3; do
echo "Downloading $myFile" # Should print to terminal
scp -q $user@$host:$myFile ./ # Might take a long time
echo "$myFile" >&3 # Should go to process substitution
done 3> >(xargs -n1 bash -c 'sleep 1; echo "Processing: $0"')
echo "Finished"
打印:
Downloading file1
Downloading file2
Downloading file3
Finished
Processing: file1
Processing: file2
Processing: file3
处理每一个可能需要比传输更长的时间。文件传输应该是连续的,因为带宽是限制因素。我想在收到文件后开始处理每个文件,而不是等待所有文件都传输。处理可以并行完成,但实例数量有限(由于内存/CPU 有限)。因此,如果第五个文件刚刚完成传输,但只有第二个文件完成了处理,则第三个和第四个文件应该在第五个文件处理之前完成处理。同时第六个文件应该开始传输。
【问题讨论】:
-
我认为没有办法。为什么要使用流程替换而不仅仅是管道?
-
这是可能的,但仅限于非常新版本的 bash。我们在这里针对的是哪个版本?
-
我使用的是 bash 4.1
-
4.1 不会削减它。
-
我将更新帖子以了解流程替换背后的原因,尽管我可能最终只使用管道。
标签: bash xargs process-substitution