某些bash脚本以exec "$@"
结束执行,通常先调用一系列命令,然后再用最初传递给脚本的参数替换其执行。
如果您要编写Python脚本来替换该bash脚本,那么最终命令将是什么?
答案 0 :(得分:2)
在bash中,
“ $ @”是所有位置参数{$ 1,$ 2, $ 3 ...}。
请参见https://stackoverflow.com/a/5163260/1420079
因此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
如果在不使用exec
标志的情况下调用Bash的-c
,则它将继承当前进程的环境,并且还使用$PATH
变量来查找要执行的程序(如果路径)不是绝对的。
因此,最接近的exec*
函数是os.execvp
( v 个可变参数,使用 p ath)。还要记住的是...
各种exec *函数采用新参数的列表 程序加载到进程中。在每种情况下,第一个 参数以其自己的名称而不是作为 用户可能在命令行上键入的参数。对于C 程序员,这是传递给程序main()的argv [0]。对于 例如,os.execvp('/ bin / echo',['foo','bar'])只会在 标准输出; foo似乎会被忽略。
因此,我将在Python中按以下方式实现Bash的exec "$@"
(假设导入了os
和sys
)
os.execvp(sys.argv[1], sys.argv[1:])
这不是一个完美的复制,Bash的exec将不处理任何参数,而此代码将引发IndexError
。