$(sleep 5) &
echo $!
sleep 1
echo "done"
上述输出:
$ ./test.sh
7483
done
但是,如果我在中搜索sleep
,ps aux
我会看到:
ps aux | rg sleep
chris 7484 0.0 0.0 132788 1432 pts/6 S+ 12:10 0:00 sleep 1
chris 7485 0.0 0.0 132788 1432 pts/6 S+ 12:10 0:00 sleep 5
chris 7519 0.0 0.0 10376 5744 pts/7 S+ 12:10 0:00 rg --no-ignore-vcs sleep
sleep 5 进程7485
不是7483
脚本的输出。这种行为的原因是什么?
运行一个运行
sleep
. 给出的 pid$!
是 shell 的。这里不需要替换,
会给你
sleep
的pid。我想
sleep
在你的例子中替换了其他东西,但无论如何背景替换可能是不必要的。只使用一个子shell,通常会给你
sleep
的 pid,因为许多 shell 在运行子 shell 中的最后一个命令时将自己替换为子命令,这有效地重用了子 shell 的 pidsleep
;但会给你shell的pid,而不是
sleep
's.