等待Bash IO重定向中的子Shell

时间:2018-10-05 10:54:32

标签: bash pipe wait pid subshell

这种情况是我需要主命令在当前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。

如何出租

  • 主要命令在当前shell中
  • “ wait”命令实际上是否在等待子shell?

我有锁定文件解决方案,但我不希望使用文件,因为整个脚本会连续运行,并且一次又一次地写入/修改文件,就像穿透文件系统一样。

2 个答案:

答案 0 :(得分:2)

bash的较新版本允许等待进程替换,但在此之前,我建议您仅使用命名管道。

mkfifo p
( ... subshell commands ... ) < p &
mainCommand > p
wait

答案 1 :(得分:1)

尝试一下。您需要在subshel​​l命令中添加kill

sleep 100 &
export BACKGROUNDPID=$!

mainCommand &> >(
  ...subshell commands...
  kill "${BACKGROUNDPID}"
) &

wait ${BACKGROUNDPID}"

# execution continue here ...