You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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提前展开变量,比如用单引号包裹:
    $ expr '$BASHPID'
    $BASHPID  # 此时expr只会把它当作字符串输出,因为单引号屏蔽了父Shell的变量展开
    
    或者显式用子Shell执行变量解析后再传给expr:
    $ bash -c 'expr $BASHPID'
    
    这样执行就会输出子Shell的PID了。

补充一点:$$和$BASHPID的区别是,$$在子Shell里仍会保留父Shell的PID,而$BASHPID会显示当前所在Shell的PID。但你的例子里因为$BASHPID被父Shell提前展开,所以哪怕expr是外部命令,拿到的还是父Shell的PID。

内容的提问来源于stack exchange,提问作者一无所有

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:35:19