gpt4 book ai didi

macos - 如何在命令行上获取 bash 子进程的进程 ID

转载 作者:行者123 更新时间:2023-11-29 08:42:34 25 4
gpt4 key购买 nike

我知道在 bash 中我们可以使用圆括号 () 创建子 shell。根据 bash 手册页:

(list) list  is  executed  in  a  subshell environment 

同时获取我们使用的当前进程 ID:

echo $$

现在我的问题是如何获取在命令行上使用 () 创建的子 shell 的进程 ID?

如果我使用这个:

echo $$; ( echo $$; ) 

我将在 stdout 上打印两次父 shell 的进程 ID,因为 $$ 甚至在子 shell 创建之前就已展开。那么如何真正强制惰性扩展呢?

[解决方案应该适用于 Mac 而不仅仅是 Linux]

更新:

建议的链接答案无效,因为 echo $BASHPID 在我的 Mac 上无效并返回空白。

最佳答案

感谢大家花宝贵的时间在这里找到我的问题的答案。

不过,我现在正在回答我自己的问题,因为我找到了一种hack 方法来在 bash ver < 4 上获取此 pid(尽管适用于所有版本)。这是命令:

echo $$; ( F='/tmp/myps'; [ ! -f $F ] && echo 'echo $PPID' > $F; )

它打印:

5642
13715

其中 13715 是子 shell 的 pid。要在我这样做时进行测试:

echo $$; ( F='/tmp/myps'; [ ! -f $F ] && echo 'echo $PPID' > $F; bash $F; ps; )

我明白了:

5642
13773
PID TT STAT TIME COMMAND
5642 s001 S 0:02.07 -bash
13773 s001 S+ 0:00.00 -bash

告诉我 13773 确实是 subshel​​l 的 pid。

注意:因为@ChrisDodd 评论说 echo $$; 我恢复到原来的解决方案( bash -c 'echo $PPID'; ) 不适用于 Linux。我的上述解决方案适用于 Mac 和 Linux。

关于macos - 如何在命令行上获取 bash 子进程的进程 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9119885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com