什么相当于Python中的Bash的exec $ @?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么相当于Python中的Bash的exec $ @?相关的知识,希望对你有一定的参考价值。

一些bash脚本使用exec "$@"结束执行,通常在最终用最初传递给脚本的参数替换它们的执行之前调用一系列命令。

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

答案

在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(可变数量的参数,使用路径)。另外要记住的是......

各种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

以上是关于什么相当于Python中的Bash的exec $ @?的主要内容,如果未能解决你的问题,请参考以下文章

从 bash 脚本对文件中的 wget 命令运行 exec 会忽略 wget 选项

Heroku:“heroku ps:exec”和“heroku run bash”有啥区别?

在 bash 脚本中嵌入简短的 python 脚本

【exec】shell脚本中的 exec 命令

exec()和eval()

Linux Shell编程中的特殊符号