如何编写一个用python调用自身的bash脚本?

如何编写一个用python调用自身的bash脚本?,python,linux,bash,shell,sh,Python,Linux,Bash,Shell,Sh,有人能解释一下这个bash脚本是如何工作的吗?我不理解的部分是:“”,这个语法在bash中是什么意思 #!/bin/sh """:" echo called by bash exec python $0 ${1+"$@"} """ import sys print 'called by python, args:',sys.argv[1:] 试运行结果: $ ./callself.sh xx called by bash called by python, args: ['xx']

有人能解释一下这个bash脚本是如何工作的吗?我不理解的部分是:“”,这个语法在bash中是什么意思

#!/bin/sh 

""":"

echo called by bash
exec python $0 ${1+"$@"}

"""

import sys
print 'called by python, args:',sys.argv[1:]
试运行结果:

$ ./callself.sh xx
called by bash
called by python, args: ['xx']


$ ./callself.sh
called by bash
called by python, args: []

真聪明在Bash中,
“:”
将仅扩展为
,这是空命令(它不做任何事情)。因此,接下来的几行将被执行,导致
exec
。此时,Bash不再存在,Python将重新读取该文件(其名称为
$0
),并转发原始参数

${1+“$@”}
的意思是:如果定义了
$1
,则作为参数
“$@”
传递,这些参数是原始Bash脚本参数。如果未定义
$1
,表示Bash没有参数,则结果为空,因此不会传递任何其他内容,即使是空字符串

在Python中,
启动一个多行字符串,其中包括Bash命令,并扩展到结尾的
。因此Python将跳到下面。

这是一个例子,在一个文件中编写多种编程语言,但仍然使其有效

它在python中如何有效

""":"

echo called by bash
exec python $0 ${1+"$@"}

"""
这是python中的一个多行docstring,因此python完全忽略它,直到
import

它在bash中如何有效

""":"

echo called by bash
exec python $0 ${1+"$@"}
exec
使用python解释器调用相同的脚本并退出脚本。因此,它不会执行其余语法错误的python语句。

此外,一旦调用了exec,其余的代码就不会执行,因为exec将用程序(在本例中是python进程)替换shell。()