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

dno*_*zay -1 python shebang

我有这个非便携式的shebang:

#!/usr/bin/env python -u
Run Code Online (Sandbox Code Playgroud)

它不可移植,因为python -u它作为一个单独的arg馈送到env我的系统上.

挑战:让这个shebang便携式只改变shebang - 也就是说一个单线.

换句话说,没有解决方案

use*_*342 11

我使用以下内容:

#!/bin/sh
"""true"
exec python -u "$0" "$@"
"""
# python code goes here
Run Code Online (Sandbox Code Playgroud)

该行将"""true"shas 解析true,因为它由一个空""字符串后跟"true".由于true是一个无操作命令,它将被有效地忽略,并且以下行将执行Python解释器.

另一方面,Python将以"""true"非常不同的方式解析该行,因为打开了一个三重引号的字符串,该字符串true"下面两行开头并关闭.由于字符串不用于任何东西,Python解释器将有效地忽略启动Python的shell片段.解释的不同之处"""xxx"在于允许Python和sh代码在同一个脚本中共存.

对于简单的测试,请添加如下内容:

import sys
print "hello!", sys.argv
Run Code Online (Sandbox Code Playgroud)

鉴于合理的sh实现(并考虑到启动Python的时间),这应该不比使用慢得多env.

  • +1这很脏,但不知何故令人满意 (3认同)
  • 傻瓜很可爱 (2认同)