在Bash IO重定向中等待子shell
Wait for the subshell in Bash IO redirection
场景是我需要在当前 shell 中使用我的主要命令 运行,这是必需的,否则会丢失所有环境内容等。
所以,我不能 运行 我的烟斗是这样的:
#command-line 1
mainCommand | (
...subshell commands...
) &
#this wait works, but main command is in child process
wait $!
我必须 运行 当前 shell 的主要命令:
#command-line 2
mainCommand &> >(
...subshell commands...
) &
#this wait is waiting for mainCommand, not subshell
wait $!
然而,在命令行 2 中,它只是一个命令,我不能只将它发送到后台,只有 subshell 应该转到后台,然后我才能得到它的 PID。
如何让
- 主命令在当前shell
- 而 'wait' 命令实际上等待子shell?
我有锁定文件的解决方案,但我更喜欢不使用文件作为整个脚本 运行 连续 writing/modifying 一个文件一次又一次就像穿透文件系统。
较新版本的 bash
允许等待进程替换,但在那之前,我建议只使用命名管道。
mkfifo p
( ... subshell commands ... ) < p &
mainCommand > p
wait
试试这个。您需要在子 shell 命令中添加 kill
。
sleep 100 &
export BACKGROUNDPID=$!
mainCommand &> >(
...subshell commands...
kill "${BACKGROUNDPID}"
) &
wait ${BACKGROUNDPID}"
# execution continue here ...
场景是我需要在当前 shell 中使用我的主要命令 运行,这是必需的,否则会丢失所有环境内容等。
所以,我不能 运行 我的烟斗是这样的:
#command-line 1
mainCommand | (
...subshell commands...
) &
#this wait works, but main command is in child process
wait $!
我必须 运行 当前 shell 的主要命令:
#command-line 2
mainCommand &> >(
...subshell commands...
) &
#this wait is waiting for mainCommand, not subshell
wait $!
然而,在命令行 2 中,它只是一个命令,我不能只将它发送到后台,只有 subshell 应该转到后台,然后我才能得到它的 PID。
如何让
- 主命令在当前shell
- 而 'wait' 命令实际上等待子shell?
我有锁定文件的解决方案,但我更喜欢不使用文件作为整个脚本 运行 连续 writing/modifying 一个文件一次又一次就像穿透文件系统。
较新版本的 bash
允许等待进程替换,但在那之前,我建议只使用命名管道。
mkfifo p
( ... subshell commands ... ) < p &
mainCommand > p
wait
试试这个。您需要在子 shell 命令中添加 kill
。
sleep 100 &
export BACKGROUNDPID=$!
mainCommand &> >(
...subshell commands...
kill "${BACKGROUNDPID}"
) &
wait ${BACKGROUNDPID}"
# execution continue here ...