如何理解`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
相关产品推荐
相关产品推荐

