有人能解释一下这个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: []发布于 2016-08-11 02:56:38
这很聪明!在Bash中的中,""":"将被扩展为只有:,这是一个空命令(它什么都不做)。因此,接下来的几行将被执行,从而导致exec。此时,Bash不再存在,该文件由Python重新读取(其名称为$0),并转发原始参数。
${1+"$@"}的意思是:如果定义了$1,将其作为参数"$@"传递,这是原始的Bash脚本参数。如果没有定义$1,意味着Bash没有参数,则结果是空的,因此没有传递其他任何内容,甚至没有传递空字符串。
在Python中,"""启动一个包含Bash命令的多行字符串,并扩展到关闭的"""。所以Python会跳到下面。
发布于 2016-08-11 03:00:58
这是多角化的一个示例,在该示例中,您在一个文件中编写多个编程语言,但仍然使其有效。
如何在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语句。
发布于 2016-08-11 03:02:28
而且,一旦调用了exec,其余的代码就不会执行,因为exec用程序替换了shell,在本例中是python进程。(http://wiki.bash-hackers.org/commands/builtin/exec)
https://stackoverflow.com/questions/38886505
复制相似问题