17

我试图理解这个问题的答案之一:

无法使用“#!/usr/bin/env python”将参数传递给 python

#!/bin/sh
''''exec python -u -- "$0" ${1+"$@"} # '''

这很好用,但我不明白为什么它在该行的开头使用四个刻度而不是三个。

此外,为什么在该字符串的末尾附近有哈希?

4

2 回答 2

29

Python 支持三引号字符串:

'''something'''

Shell 仅支持单引号字符串:

'something'

通过使用四个引号,sh将其视为 2 个空字符串,但 Python 将前三个视为三引号字符串的开头,并将第四个视为字符串值的一部分。

然后,该行的其余部分被 解释为命令sh,但被 Python 解释为字符串的一部分。

就目前而言, #then 形成一个注释sh,但它仍然是 Python 的一个字符串,用一个结束的三引号将其关闭。

所以,总结一下:

  • sh看到:空字符串 ( '') -空字符串 ( '') -命令 ( exec python -u -- "$0" ${1+"$@"}) -注释 ( # ''')
  • Python 看到:三引号字符串文字(包含字符'exec python -u -- "$0" ${1+"$@"} #

所以sh执行那个命令,用python -u --脚本名称和其余的命令行参数替换它自己,Python 读取这个文件,只看到一个初始的字符串文字,它不会去任何地方。

因为它是文件中的第一个字符串文字,它将被设置为__main__模块的文档字符串,但如果这是主脚本,这几乎无关紧要。

于 2013-07-03T21:41:03.477 回答
-1

我只是使用:

#!/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)
于 2014-01-10T19:06:32.003 回答