为什么这个带有shebang#!/ bin / sh和exec python的代码片段在4个单引号内起作用?
我正在尝试了解此问题的答案之一:
无法使用“#!/ usr / bin / env
python”将参数传递给python
#!/bin/sh
''''exec python -u -- "$0" ${1+"$@"} # '''
这很好用,但是我不明白为什么它在该行的开头使用四个刻度而不是三个刻度。
另外,为什么哈希值接近该字符串的末尾?
-
Python支持三引号字符串:
'''something'''
Shell仅支持单引号字符串:
'something'
通过使用 四个 引号,
sh
将其视为2个空字符串,但Python将前三个视为三引号字符串的开头,并将第四个作为字符串值的一部分。然后,该行的其余部分由解释为命令
sh
,但由Python解释为字符串的一部分。在
#
随后形成尽可能评论sh
而言,但它仍然是一个字符串到Python,有三个结束引号关闭它。因此,总结一下:
sh
sees: 空字符串(''
) - 空字符串(''
) - 命令(exec python -u -- "$0" ${1+"$@"}
) - 注释(# '''
)- Python看到: 三引号括起来的字符串文字(包含字符
'exec python -u -- "$0" ${1+"$@"} #
)
因此
sh
执行该命令,并python -u --
用脚本名称和其余命令行参数替换自身,Python读取该文件,然后看到一个初始字符串文字,该文字不会随处可见。因为它是文件中的第一个字符串文字,所以它将被设置为
__main__
模块的文档字符串,但这与主脚本无关紧要。