expr 不是 Linux 内置命令,为什么 expr $BASHPID 显示当前 shell pid?
太奇怪了!我认为它应该输出子shell pid。
$ type expr
expr is hashed (/usr/bin/expr)
$ echo $$
49207
$ expr $BASHPID
49207
Run Code Online (Sandbox Code Playgroud)
这是正常的并且是预期的:参数扩展发生在命令执行之前,因此BASHPID告诉您 bash 实例的 PID,该实例确定要传递给哪些参数expr,而不是其本身的 PID expr。当 afork()发生时,这些论点已经确定。
如果您想要 expr 本身的 PID,可以使用显式子 shell 使 fork 更早发生,然后使用execmakeexpr继承该子 shell 的 PID:
echo "Parent PID is $$ / $BASHPID"
(printf %s 'expr PID is '; exec expr "$BASHPID")
Run Code Online (Sandbox Code Playgroud)
创建(一个显式子 shell(而不是在执行过程中创建的隐式子 shell),BASHPID然后提供其 PID;exec导致expr继承该 PID。