这种情况是我需要主命令在当前shell中运行,这是必需的,否则会丢失所有环境内容,等等。
所以,我不能只是这样运行管道:
#command-line 1
mainCommand | (
...subshell commands...
) &
#this wait works, but main command is in child process
wait $!
我必须在当前shell中运行main命令:
#command-line 2
mainCommand &> >(
...subshell commands...
) &
#this wait is waiting for mainCommand, not subshell
wait $!
但是,在第2行中,它只是一个命令,我不能仅将其发送到后台,只有子shell应该转到后台,然后我才能获取其PID。
如何出租
我有锁定文件解决方案,但我不希望使用文件,因为整个脚本会连续运行,并且一次又一次地写入/修改文件,就像穿透文件系统一样。
答案 0 :(得分:2)
bash
的较新版本允许等待进程替换,但在此之前,我建议您仅使用命名管道。
mkfifo p
( ... subshell commands ... ) < p &
mainCommand > p
wait
答案 1 :(得分:1)
尝试一下。您需要在subshell命令中添加kill
。
sleep 100 &
export BACKGROUNDPID=$!
mainCommand &> >(
...subshell commands...
kill "${BACKGROUNDPID}"
) &
wait ${BACKGROUNDPID}"
# execution continue here ...