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

如何理解`exec python3 "$0" "$@"`及sh -c后的"$0" "$@"含义

Node.js configure脚本中sh -c '<command>'后"$0" "$@"的含义解析

先确认你理解的部分是正确的

这段代码是Node.js configure脚本的开头,核心逻辑就是:当你用./configure执行脚本时,因为首行是#!/bin/sh,Shell会先接管执行,依次检查系统中是否有python3.11、python3.10,找到可用的版本后,用该Python解释器替换当前Shell进程(通过exec),重新执行整个脚本;如果前两个都找不到,就用系统默认的python。


重点解析sh -c '<command>'后的"$0" "$@"

要搞懂这个,得先明确Shell中sh -c的参数规则:
sh -c "要执行的命令串" arg0 arg1 arg2 ...

  • "要执行的命令串":是让子Shell运行的代码
  • arg0:会成为子Shell环境里的$0(也就是当前进程的"标识名",通常是脚本文件名)
  • arg1及之后的参数:会成为子Shell里的$1、$2...,$@则代表所有这些位置参数的集合

回到这段代码:
sh -c '''...''' "$0" "$@"
这里的"$0"就是当前configure脚本的文件名,"$@"是你执行./configure时传入的所有参数(比如./configure --prefix=/usr/local这类参数)。把这俩传给sh -c,就是让子Shell里的代码能拿到原脚本的名字和参数,然后在子Shell的代码里,通过exec pythonX.Y "$0" "$@",把这些信息原封不动传给Python解释器——这样Python执行脚本时,就能拿到和你当初执行Shell时完全一样的参数,保证逻辑连贯。


补充:那个奇怪的_=[ 'exec' ... ]是啥逻辑

这是个兼顾Shell和Python的双兼容写法:

  • 对Shell来说:_=[ 'exec' ... ]会被解析成执行[(也就是Shell的test命令),后面的所有内容都是[的参数,直到最后一个]。而[命令执行时,会触发里面的exec逻辑,用Python进程替换当前Shell进程,后面的Python代码自然就不会被Shell解析了。
  • 对Python来说:_=[ 'exec' ... ]就是给变量_赋值了一个列表,后面的del _把这个临时变量删掉,不影响后续import sys等Python代码的执行。

内容的提问来源于stack exchange,提问作者Lala James

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:47:42