expr并非Linux内置命令,为何执行expr $BASHPID返回当前Shell PID?
为什么外部命令
expr执行expr $BASHPID会显示当前Shell的PID? 这是Bash的参数展开时机决定的:
- 在执行任何命令(不管是内置命令还是外部命令)之前,父Shell会先对命令行里的变量、通配符等做展开处理。当你输入
expr $BASHPID时,父Shell会先把$BASHPID替换成当前Shell的PID数值,再启动expr进程。expr收到的只是一个现成的数字,根本不会去解析$BASHPID这个变量。 - 如果你想让
$BASHPID在子Shell中解析,得阻止父Shell提前展开变量,比如用单引号包裹:
或者显式用子Shell执行变量解析后再传给$ expr '$BASHPID' $BASHPID # 此时expr只会把它当作字符串输出,因为单引号屏蔽了父Shell的变量展开expr:
这样执行就会输出子Shell的PID了。$ bash -c 'expr $BASHPID'
补充一点:$$和$BASHPID的区别是,$$在子Shell里仍会保留父Shell的PID,而$BASHPID会显示当前所在Shell的PID。但你的例子里因为$BASHPID被父Shell提前展开,所以哪怕expr是外部命令,拿到的还是父Shell的PID。
内容的提问来源于stack exchange,提问作者一无所有
相关产品推荐
相关产品推荐

