【问题标题】:$$ in a script vs $$ in a subshell脚本中的 $$ 与子 shell 中的 $$
【发布时间】:2011-04-11 00:00:12
【问题描述】:

$$ 在脚本中使用时给出脚本进程的进程 ID,如下所示:

示例 1

#!/bin/bash
# processid.sh
# print process ids

ps -o cmd,pid,ppid
echo "The value of \$\$ is $$"

$ ./processid.sh 
CMD                           PID  PPID
bash                        15073  4657
/bin/bash ./processid.sh    15326 15073
ps -o cmd,pid,ppid          15327 15326
The value of $$ is 15326

观察$$ps给出的pid是15326

我的 shell 提示符是 pid 15073

但在子 shell 中,$$ 给出了父 shell 的 pid(即 15073)

示例 2

$ ( ps -o cmd,pid,ppid ; echo $$ )
CMD                           PID  PPID
bash                        15073  4657
bash                        15340 15073
ps -o cmd,pid,ppid          15341 15340
15073

这里的子shell是pid 15340

问题:为什么会这样?脚本不是也在子shell中运行吗?示例 2 中的子 shell 与示例 1 中运行脚本的 shell 有什么区别?

【问题讨论】:

    标签: bash shell scripting


    【解决方案1】:

    我尝试转义(将 $$ 传递给子外壳)不起作用,因为子外壳从父 bash 继承 $$ 值。解决这个问题的方法是使用 $BASHPID。

    (echo $$; echo $BASHPID)
    

    从父 shell 和子 shell 打印 PID。

    【讨论】:

      【解决方案2】:

      来自 bash 手册页:

         $      Expands  to  the  process ID of the shell.  In a () subshell, it
                expands to the process ID of the current  shell,  not  the  sub-
                shell.
      

      【讨论】:

      【解决方案3】:

      替换发生在父 shell 中;替换发生时子shell尚未启动。

      【讨论】:

      • 你能再描述一下吗?我无法理解你在说什么。谢谢!
      • @abc:因为您的子shell 永远不会看到$$。它被( echo 1234 ) 调用,因为你的父shell 已经用它的PID 替换了$$。你必须逃避它,这样子shell才能看到$$。
      • @flolo 我该如何逃脱它。能给个代码吗?我试过\$$,$\$。那没有做任何事情。
      • 我不认为你能逃脱它。你可以使用上面提到的$BASHPID,或者更便携的sh -c 'echo $PPID'
      • 是的,这不是关于谁来代替; $$ is 在子 shell 中评估,它只是故意评估到主 shell 的 PID,如手册页所述。
      【解决方案4】:

      一种更便携的方式,仅限 linux,但也与 dash 兼容:

      read -r my_pid _ < /proc/self/stat
      echo $my_pid
      

      【讨论】:

      • 这让我很担心,因为$BASHPID 仅适用于 bash! sh -c 'echo $$;echo $$&amp;&amp;sleep 5&amp;sleep 1;echo $!' 我希望第二个数字等于第三个,$BASHPID 是空白的,所以:sh -c 'echo $$;read a _&lt;/proc/self/stat&amp;&amp;echo $a&amp;&amp;sleep 5&amp;sleep 1;echo $!' 有效,谢谢!
      猜你喜欢
      • 2012-02-20
      • 2018-02-13
      • 1970-01-01
      • 2023-03-09
      • 2014-10-28
      • 1970-01-01
      • 1970-01-01
      • 2018-05-19
      • 2012-03-22
      相关资源
      最近更新 更多