【问题标题】:shell in () is another process?shell in () 是另一个进程吗?
【发布时间】:2013-06-27 17:44:25
【问题描述】:

我正在通过高级 Bash 脚本指南学习 bash-shell。这本书说

括号内的命令列表开始一个子shell。

所以,我尝试了这段代码:

echo "in parentshell \$\$=$$"
( echo "in subshell \$\$=$$" )

我认为后者应该打印子进程的pid,但实际上结果与父shell的pid相同。谁能告诉我为什么?

【问题讨论】:

    标签: bash pid


    【解决方案1】:

    根据Special Parameters section of the reference manual

    $$ 扩展为 shell 的进程 ID。在() 子shell 中,它扩展为调用shell 的进程ID,而不是子shell。

    所以你观察到的行为没有什么奇怪的,它有完整的记录。

    正如 Ansgar Wiechers 在评论中正确地观察到的那样,

    子shell的PID可以通过变量$BASHPID来确定。

    这方面的文档可以在Bash Variables section of the reference manual 中找到。在那里你会读到:

    BASHPID 扩展为当前 Bash 进程的进程 ID。在某些情况下,这与 $$ 不同,例如不需要重新初始化 Bash 的子 shell。

    感谢安斯加!

    注意。我不太喜欢你正在阅读的参考资料。

    【讨论】:

    • 子shell的PID可以通过变量$BASHPID来确定。
    • 感谢 gniourf_gniourf 和 A​​nsgar Wiechers。你能给我一些像我这样的初学者的书或材料吗?我不想阅读 bash 手册(请原谅我)。我的英语不够。我会迷失自己,因为我不知道关键点在哪里。也许,我真正想知道的是,你是如何学习 bash、Linux 之类的知识的。许多人告诉我阅读手册和维基。但是作为一个初学者,我什至不知道我需要阅读哪些部分,以及可以延迟的内容。
    • @Donglei 在this page 你会发现一些很好的参考资料(和一些不太好的参考资料)。我可以告诉你,Lhunath 的一切都非常棒,并且会向你展示最好的 bash 做法!但这确实是基于意见的,可能不应该出现在这里! :) 但是当对某个特定点有疑问时,请阅读参考手册,如果之后仍有疑问,请来这里,您会找到人来澄清您的观点。
    • 非常感谢,我喜欢这个地方。有这么多热情的人。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-02-10
    • 2018-07-15
    • 1970-01-01
    • 2018-11-14
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多