make #!/usr/bin/env python -u shebang portable
我有一个非便携式的shebang:
1
| #!/usr/bin/env python -u |
它是不可移植的,因为在我的系统上,python -u作为单个arg被送入env。
挑战:使这个shebang便携式只改变shebang-也就是说一个一行。
换句话说,没有解决方案
- 从问题中禁用输出缓冲
- 不能用""将参数传递给python!/usr/bin/env python"
- 我要求的解决方案只涉及shebang线,而不是多线解决方案。
我将使用以下内容:
1 2 3 4 5
| #!/bin/sh
"""true"
exec python -u"$0""$@"
"""
# python code goes here |
行"""true"将由sh解析为true,因为它由一个空的""字符串后跟"true"组成。由于true是一个no-op命令,它将被有效地忽略,下面的行将执行python解释器。
另一方面,python将以非常不同的方式解析"""true"行,因为三重引号字符串的开头是true",下面两行是闭合的。由于该字符串不用于任何内容,所以python解释器将有效地忽略启动python的shell片段。在解释"""xxx"时,允许python和sh代码在同一个脚本中共存是不同的。
对于一个简单的测试,附加如下内容:
1 2
| import sys
print"hello!", sys.argv |
考虑到合理的sh实现(并考虑到启动python的时间),这不应该比使用env慢得多。
- 很可爱的数据
- +1这很肮脏,但不知何故令人满意。
- 一个缺点是,黑客将被视为脚本docstring的一部分(如果不是全部的话)。
- @切普纳这在实践中是个问题吗?可导入模块的docstring非常有用,但我想不出在可执行脚本中使用docstring。
- pydoc将模块docstring的内容显示为脚本的描述。
- 您不能继续添加到docstring的结尾吗?
- TCL也有类似的把戏(用评论规则玩游戏)