关于bash:为什么这个带有shebang#!/ bin / sh和exec python 4个单引号内的片段有效?

Why does this snippet with a shebang #!/bin/sh and exec python inside 4 single quotes work?

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

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

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

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

另外,为什么哈希接近那个字符串的末尾?


Python支持三引号字符串:

1
'''something'''

Shell仅支持单引号字符串:

1
'something'

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

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

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

所以,总结一下:

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

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

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


我只是用:

1
2
3
4
5
#!/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)