加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 获取当前的子shell

发布时间:2020-12-15 18:46:51 所属栏目:安全 来源:网络整理
导读:我正在尝试获取当前执行的subshel??l的pid,但是$$只返回父pid: #!/usr/bin/shx() { 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 "Jus
我正在尝试获取当前执行的subshel??l的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

看来,在上文中,从不创建一个subshel??l,因此第二个语句返回主shell的PID.相比之下,如果我们在括号内放置两个语句,则会创建subshel??l,并且输出符合我们的预期.即使另一个声明只是一个冒号,这是真的:.在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' && :)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读