bash – 获取当前的子shell

前端之家收集整理的这篇文章主要介绍了bash – 获取当前的子shell前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试获取当前执行的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' && :)
原文链接:https://www.f2er.com/bash/386321.html

猜你在找的Bash相关文章