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

标签 python bash arguments sh shebang

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

Cannot pass an argument to python with "#!/usr/bin/env python"

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

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

此外,为什么哈希值靠近该字符串的末尾?

最佳答案

Python 支持三引号字符串:

'''something'''

Shell 仅支持单引号字符串:

'something'

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

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

sh 而言,# 构成注释,但对于 Python 来说它仍然是一个字符串,用三引号结束。

总结一下:

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

因此 sh 执行该命令,将自身替换为 python -u -- 脚本名称和其余命令行参数,Python 读取该文件并且只看到一个不会去任何地方的初始字符串文字。

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

关于python - 为什么这个带有 shebang #!/bin/sh 和 4 个单引号内的 exec python 的片段有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17458528/

相关文章:

mysql - BASH中如何判断mysql中是否有用户?

c++ - 指定默认参数 C++

c - 将输入从标准输入传递到函数时进行缓冲

javascript - 如何在 Javascript 的基于 promise 的设置中调用 "apply"以将参数传递给下一个 then()?

python - Numba 可以与 TensorFlow 一起使用吗?

python - 机器学习中识别非训练项目的可能性

linux - 不同文件类型的部分文件重命名

python - 运行docker镜像提供-无法找到镜像错误

python - 类型错误:必须是 str,而不是类型

security - 使用 shell 脚本进行 CGI 编程