如何在由Bash运行的脚本的shebang(#!)中设置环境变量?

5
或者,如果您正确将文件设置为可执行文件,为什么这样不起作用?(在我的系统上它只是挂起,但可以用^C终止。)
#!/usr/bin/env TEST=TEST python
print('hello')

尽管如此:

#!/usr/bin/env python
print('hello')

就像这样:

[fred@pc build]$ /usr/bin/env TEST=TEST python hello.py 
hello

在我的电脑上(Mac)运行正常,即使使用 print(os.environ['TEST']) 进行检查也没有问题。 - cdarke
如果您的系统上有strace,请使用类似strace -f script-name的命令运行脚本(其中-f表示“跟随子进程”)。我猜测是python在等待stdin即键盘输入时出现了“挂起”的情况,因此您应该能够从strace输出中看到以read(0,...开头的一行。如果这样还不行,请按<CTRL>+D键以输入EOF。 - cdarke
2个回答

7
自8.30版本起,env命令提供了-S选项,使得在Linux上的使用变得更加便捷:
使用方式:
#!/usr/bin/env -S TEST=TEST python

5
在某些系统上,包括Linux,在执行

标签中的操作时,会产生以下影响:
#!/usr/bin/env TEST=TEST python

如果您使用'./hello.py'运行它,则在'hello.py'中的line与运行相同

/usr/bin/env 'TEST=TEST python' ./hello.py

请注意,'TEST=TEST python'是一个参数。这会导致 'env' 设置环境变量TEST'TEST python'并使用exec运行./hello.py。然后再次处理shebang行,并递归重复该过程。总体效果是反复执行env直到进程被中断。如果您在执行过程中在系统上运行top,您会看到一个非常繁忙的进程。
请参阅Shebang (Unix)维基百科文章了解有关#!机制如何工作的信息。它包括一些有关不同系统处理方式的详细信息。
在Linux和许多其他系统上无法在shebang行中设置环境变量。您需要将其设置在程序本身中,或者如果不适用,则使用包装程序(例如一个微不足道的shell程序)来运行Python程序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接