我有一个包含两个函数的脚本。一个函数将另一个函数作为后台进程启动,并返回该进程的 UID。只要我不想将 PID 放入专用变量中,这种方法就很有效。一旦我尝试将 PID 分配给变量,脚本就会挂起,直到后台操作完成。
此行为可以通过以下脚本演示:
#!/bin/sh
foo () {
bar & # start bar in background
echo $! # return bars' PID
}
bar () {
sleep 5 # some background operation
}
FOO=$(foo) # remember the PID of bar
echo $FOO # expectation: should echo immediately
# reality: echo after five seconds
所以,我的问题是:如何让脚本在启动bar
函数后继续执行,而不等待bar
返回?
答案1
由其启动的子 shell$(foo)
必须完全退出(以及任何后台进程),以便主 shell 知道命令替换不会捕获更多输入。毕竟,bar
睡眠后可以输出一些东西。
但是您可以将输出重定向bar
到/dev/null
:
foo () {
bar > /dev/null &
echo "$!"
}
或者(在 Bash 或 ksh 中)取消命令替换并bar
在主 shell 中运行:
foo() {
typeset -n _pid=$1
bar &
_pid=$!
}
foo FOO
echo "$FOO"
eval
(或与标准中的等效项sh
。)