当前位置: 首页 > 面试题库 >

为什么这个带有shebang#!/ bin / sh和exec python的代码片段在4个单引号内起作用?

洪鸿
2023-03-14
问题内容

我正在尝试了解此问题的答案之一:

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

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

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

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


问题答案:

Python支持三引号字符串:

'''something'''

Shell仅支持单引号字符串:

'something'

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

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

#随后形成尽可能评论sh而言,但它仍然是一个字符串到Python,有三个结束引号关闭它。

因此,总结一下:

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

因此sh执行该命令,并python -u --用脚本名称和其余命令行参数替换自身,Python读取该文件,然后看到一个初始字符串文字,该文字不会随处可见。

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



 类似资料:
  • 问题内容: 我正在阅读有关ConcurrentModificationException以及如何避免它的信息。找到了一篇文章。该文章中的第一个清单具有与以下相似的代码,这显然会导致异常: 然后,它继续以各种建议解释如何解决该问题。 当我尝试重现它时,我没有遇到异常! 为什么我没有得到例外? 问题答案: 根据JavaAPI文档,Iterator.hasNext不会抛出。 检查后,您从列表中删除了一个

  • 因此,下面的代码,从txt文件中取序列号作为参数,在我的计算机上正常工作。每个数字都写在一行上。下面是代码: 但它在CodeEval中不起作用。站点编译器是这么说的: Fontconfig错误:无法加载默认配置文件线程“main”java.awt.HeadLessException:未设置X11显示变量,但此程序执行了需要它的操作。在java.awt.GraphicsEnvironment.Che

  • 问题内容: 我正在阅读DigitalOcean的golang客户程序。我注意到他们在变量中创建了* Op结构的实例。示例:https: //github.com/digitalocean/godo/blob/master/droplets.go#L32 为什么需要此行? 问题答案: 该行是*DropletsServiceOp满足DropletsService接口的编译时检查。 该行对程序的执行没有

  • 令牌“if”的语法错误(应在此令牌之后 谢谢你的建议!

  • 问题内容: 当我在外壳中研究这个问题的答案时,我注意到,即使指向系统上的两个命令,它们的行为也有所不同。首先,输出 是: 但是,通过以下命令调用以下命令: 返回此错误: 通过以下命令运行相同命令时: 成功执行,以下是输出: 供参考,以下是以下内容: 为什么两个调用的行为不同? 问题答案: 查看(bash在C语言中实现)的值,以确定如何调用它。 当作为调用它的行为被记录在手册中: 如果使用name调

  • 在这里测试一下。 然而,我想匹配一对字符后的字符,所以我想我可以简单地把它放在后面: 不幸的是,这与任何东西都不匹配。