Python中等价于Bash的exec $@是什么?

6
一些bash脚本以exec "$@"结束执行,通常在最终用传递给脚本的参数替换它们的执行之前调用一系列命令。
如果您要编写一个用Python替换该bash脚本的脚本,最终命令将是什么?
1个回答

9
在bash中,"$@"是所有位置参数的类似数组的结构,{$1, $2, $3 ...}。
参见https://dev59.com/ZW435IYBdhLWcg3w4UMb#5163260 因此,exec "$@"将调用所有附加的位置参数,第一个参数是程序名称,随后的参数是替换程序的参数。
在Python中,sys.argv(来自sys模块)是...
命令行传递给Python脚本的参数列表。argv [0]是脚本名称(这取决于操作系统是否为完整路径名)。如果使用-c命令行选项执行命令,则argv [0]设置为字符串“-c”。如果没有将脚本名称传递给Python解释器,则argv [0]为空字符串。
参见https://docs.python.org/3/library/sys.html#sys.argv

用另一个进程替换当前正在运行的进程是os.exec*函数族的工作(毫不意外,来自os模块),请参见https://docs.python.org/3/library/os.html#os.execvp

如果没有使用-c标志调用Bash的exec,它将继承当前进程的环境,并使用$PATH变量查找要执行的程序,如果路径不是绝对路径。

因此,最接近的exec*函数是os.execvpvariable参数数量,使用path)。还要注意的是...

各种exec*函数需要一个新程序的参数列表加载到进程中。在每种情况下,这些参数中的第一个将作为新程序的名称传递,而不是用户可能在命令行上输入的参数。对于C程序员来说,这是传递给程序main()的argv[0]。例如,os.execvp('/bin/echo',['foo','bar'])只会在标准输出上打印bar;看起来忽略了foo。
所以,我将在Python中实现Bash的exec "$@",如下所示(假设已导入ossys):
os.execvp(sys.argv[1], sys.argv[1:])

这并不是完美的复制,Bash的exec会将无参数处理为无操作,而这段代码会抛出IndexError错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接