我正在尝试理解这个问题的一个答案:
使用“#!/usr/bin/env python”不能传递参数给Python
#!/bin/sh
''''exec python -u -- "$0" ${1+"$@"} # '''
这个方法可以很好地工作,但是我不明白为什么需要在那一行的开头使用四个反引号而不是三个。
此外,为什么字符串末尾需要一个井号?
Python支持三引号字符串:
'''something'''
Shell仅支持单引号字符串:
'something'
通过使用四个引号,sh
将其视为 2 个空字符串,但 Python 将前三个视为三引号字符串的开头,并将第四个包含在字符串值中。sh
将该行的其余部分解释为命令,但 Python 将其视为字符串的一部分。sh
来说,#
形成了注释,但对于 Python 来说,它仍然是一个字符串,并用闭合三引号结束。sh
看到:空字符串(''
) - 空字符串(''
) - 命令(exec python -u -- "$0" ${1+"$@"}
) - 注释(# '''
)'exec python -u -- "$0" ${1+"$@"}#'
)sh
执行该命令,将自身替换为带有脚本名称和其余命令行参数的 python -u --
,而 Python 读取此文件并仅看到不会消失的初始字符串文字。__main__
模块的文档字符串,但如果这是主要脚本,则几乎不会有任何影响。${1+"$@"}
是什么?它与$@
有何不同? - Dog"$@"
(带引号的参数),否则替换为null。 - Martijn Pieters${1+"$@"}
的上下文信息。因此,在许多情况下,"$@"
本身就可以正常工作。 - akhan我只是使用:
#!/bin/sh
''':'
exec python -tt "$0" "$@"
'''
# The above shell shabang trick is more portable than /usr/bin/env and supports adding arguments to the interpreter (python -tt)
$PATH
中的任何 Python,因此与#!/usr/bin/env -i python
相比非常不安全,而且(更好的方法)是知道并使用完整路径:#!/usr/bin/python
。 - Alois Mahdal