前端之家收集整理的这篇文章主要介绍了
bash – 获取当前的子shell,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_
301_0@
我正在尝试
获取当前执行的subshell的pid,但是$$只返回父pid:
#!/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
如上所述,当我从我背景的函数中运行$$时,它不会像我做$时显示PID一样!从父壳.
现代bash
如果您正在运行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' && :)