【问题标题】:Difference between bash pid and $$bash pid 和 $$ 之间的区别
【发布时间】:2011-12-13 01:53:02
【问题描述】:

我是 bash 脚本初学者,我有一个“家庭作业”要做。我想出了大部分内容,但有一部分说我必须回显父 bash 的 pid 和我将运行的两个子 shell 的 pid。于是上网查了一下,找到了这个(The Linux documentation project)

#!/bin/bash4

echo "\$\$ outside of subshell = $$"                              # 9602
echo "\$BASH_SUBSHELL  outside of subshell = $BASH_SUBSHELL"      # 0
echo "\$BASHPID outside of subshell = $BASHPID"                   # 9602

echo

( echo "\$\$ inside of subshell = $$"                             # 9602
  echo "\$BASH_SUBSHELL inside of subshell = $BASH_SUBSHELL"      # 1
  echo "\$BASHPID inside of subshell = $BASHPID" )                # 9603
  # Note that $$ returns PID of parent process.

所以这是我的问题:

1) 第一个回显打印什么?这是父 bash 的 pid 吗?

2) 为什么第二个回显打印出 0?

3) $BASH_SUBSHELL 是命令还是变量?

4) 我在 mac 上做所有事情,过几天我会在 Linux 机器上尝试所有这些,但是 每当我运行此脚本$BASHPID 时不会返回任何内容,我只会换行。这是因为我在 Mac 上运行它而 $BASHPID 在 Mac 上不起作用?

【问题讨论】:

    标签: linux macos bash


    【解决方案1】:

    documentation这个,是这样的:

    1. $$ 表示运行脚本文件的进程 ID。对于任何给定的脚本,当它运行时,它将只有一个“主”进程 ID。无论您调用多少个子shell,$$ 将始终返回与脚本关联的第一个进程 ID。 BASHPID 将向您显示当前 bash 实例的进程 ID,因此在子 shell 中它将不同于可能已调用它的“顶级”bash。
    2. BASH_SUBSHELL 表示您所在的“子shell 级别”。如果您不在任何子shell 级别,则您的级别为零。如果您在主程序中启动子 shell,则该子 shell 级别为 1。如果您在该子 shell 中启动子 shell,则级别为 2,依此类推。
    3. BASH_SUBSHELL 是一个变量。
    4. 也许BASHPID 不受您拥有的 bash 版本的支持?我怀疑这是一个“Mac”问题。

    【讨论】:

    • 感谢您为我解答这些问题。我发现我有 GNU bash,版本 3.2.48(1)。
    • 是的,macOS 运行 非常 旧版本的 bash
    【解决方案2】:

    最好熟悉bash(1)

       BASHPID
              Expands to the process ID of the current bash process.
              This differs from $$ under certain circumstances, such
              as subshells that do not require bash to be re-
              initialized.
       [...]
       BASH_SUBSHELL
              Incremented by one each time a subshell or subshell
              environment is spawned.  The initial value is 0.
    

    $BASHPID 是用bash-4.0-alpha 引入的。如果您运行bash --version,您可以找出您使用的bash(1) 的版本。

    如果您要做很​​多bash(1) 的工作,您还需要以下内容:

    【讨论】:

    • 所以 $BASHPID 对我不起作用,因为我有 3.2.48 版本。可能我需要更新我的 bash 版本。
    • 不要升级bash提供的OS X。如果您出于某种原因想要新版本的bash(1),请确保以不会以任何方式影响系统提供的 shell 的方式安装它。我不知道 bash4 与 bash3 保持了多少向后兼容性,但除非 Apple 努力保持在 POSIX sh(或其他一些受限制的功能子集)的限制内,否则升级版本可能会破坏某些东西。
    • 如果你的 bash 版本中没有 $BASHPID,可以使用 export BASHPID=$(sh -c 'echo $PPID') 来获取
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 2022-06-28
    • 2012-02-20
    • 2015-04-01
    • 2020-08-22
    • 1970-01-01
    相关资源
    最近更新 更多