有很多goodreasons使用#!在/ usr/bin中/ env的。底線:它使你的代碼更加便攜。好吧,呃。檢查了這一點....#!/usr/bin/env和進程名稱:可移植性的價格?
我有兩個幾乎相同的腳本,bintest.py
#! /usr/bin/python
import time
time.sleep(5*60)
和envtest.py
#! /usr/bin/env python
import time
time.sleep(5*60)
注意,他們只在他們shebangs不同。
bintest.py
預期
[email protected]:~$ ./bintest.py & ps && killall bintest.py [1] 15061 PID TTY TIME CMD 14625 pts/0 00:00:00 bash 15061 pts/0 00:00:00 bintest.py 15062 pts/0 00:00:00 ps [email protected]:~$ [1]+ Terminated ./bintest.py
但envtest.py
運行做了低於最佳
[email protected]:~$ ./envtest.py & ps && killall envtest.py [1] 15066 PID TTY TIME CMD 14625 pts/0 00:00:00 bash 15066 pts/0 00:00:00 python 15067 pts/0 00:00:00 ps envtest.py: no process found [email protected]:~$ killall python [email protected]:~$ [1]+ Terminated ./envtest.py
我們所看到的是,使用#! /usr/bin/env
導致進程接收名稱「python」而不是「envtest.py」,從而渲染我們的killall
無效。在某種程度上,我們似乎已經爲另一種方式交換了一種可移植性:我們現在可以輕鬆地換出python解釋器,但是我們已經在命令行上失去了「可執行性」。那是怎麼回事?如果這裏有一個最佳實踐,那麼它是什麼?
也有一些很好的理由*不*使用'#在/ usr/bin中/ env'!;看到[這個問題](http://unix.stackexchange.com/q/29608/10454)和[我的回答](http://unix.stackexchange.com/a/29620/10454)。 –
@KeithThompson,我把賞金放在這個上的原因是因爲我正在研究一組需要在Linux和Mac OS X上運行的腳本,並且他們將需要的可執行文件放在$ PATH的不同位置,但是我仍然喜歡''top''來正確列出每一個,這樣你就可以區分一個腳本和另一個腳本。 –
解決方案不是使用安裝腳本替換shebang行上正確的本地解釋器嗎? – tripleee