make#!/ usr / bin / env python -u shebang portable

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"


我将使用以下内容:

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慢得多。