与Python中Bash的exec $ @等效吗?

时间:2019-03-21 16:18:15

标签: python bash

某些bash脚本以exec "$@"结束执行,通常先调用一系列命令,然后再用最初传递给脚本的参数替换其执行。

如果您要编写Python脚本来替换该bash脚本,那么最终命令将是什么?

1 个答案:

答案 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 "$@"(假设导入了ossys

os.execvp(sys.argv[1], sys.argv[1:])

这不是一个完美的复制,Bash的exec将不处理任何参数,而此代码将引发IndexError