expr 不是 Linux 内置命令,为什么 expr $BASHPID 显示当前 shell pid

一无所*_*无所有 0 linux bash shell

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)

Cha*_*ffy 5

这是正常的并且是预期的:参数扩展发生在命令执行之前,因此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。