我正在尝试获取当前执行的subshell的pid,但是$$只返回父pid:
@H_502_12@
现代bash
#!/usr/bin/sh x() { echo "I am a subshell x echo 1 and my pid is $$" } y() { echo "I am a subshell y echo 1 and my pid is $$" } echo "I am the parent shell and my pid is $$" x & echo "Just launched x and the pid is $! " y & echo "Just launched y and the pid is $! " wait
产量
I am the parent shell and my pid is 3107 Just launched x and the pid is 3108 I am a subshell x echo 1 and my pid is 3107 Just launched y and the pid is 3109 I am a subshell y echo 1 and my pid is 3107
如果您正在运行bash v4或更高版本,则子shell的PID可在$BASHPID中使用.例如:
$echo $$$BASHPID ; ( echo $$$BASHPID ) 32326 32326 32326 1519
在主shell中,$BASHPID与$$相同.在子shell中,它被更新为子shell的PID.
旧的bash(3.x或更早版本)
前版本4,你需要一个workaround:
$echo $$; ( : ; bash -c 'echo $PPID' ) 11364 30279
(帽子提示:kubanczyk)
为什么结肠?
注意,没有冒号,解决方法不起作用:
$echo $$; ( bash -c 'echo $PPID' ) 11364 11364
看来,在上文中,从不创建一个subshell,因此第二个语句返回主shell的PID.相比之下,如果我们在括号内放置两个语句,则会创建subshell,并且输出符合我们的预期.即使另一个声明只是一个冒号,这是真的:.在shell中,这是一个无操作:它什么都不做.然而,在我们的情况下,它强制创建足以完成我们想要的子shell.
短跑
在debian类系统上,破折号是默认shell(/ bin / sh). PPID方法适用于破折号,但又有另一个扭曲:
$echo $$; ( dash -c 'echo $PPID' ) 5791 5791 $echo $$; ( : ; dash -c 'echo $PPID' ) 5791 5791 $echo $$; ( dash -c 'echo $PPID'; : ) 5791 20961
用破折号,在命令之前放置:命令是不够的,但放在后面.
POSIX
PPID包含在POSIX specification中.
可移植性
mklement0报告以下工作原理与bash,dash和zsh但不是ksh:
echo $$; (sh -c 'echo $PPID' && :)