通過所謂的shebang線將腳本綁定到特定的解釋器是在操作系統上的衆所周知的練習。例如,如果執行了以下腳本(給定足夠的文件系統許可權),操作系統將啓動該腳本的文件名作爲其第一個參數的解釋器/bin/sh
。隨後,shell將在腳本中執行跳過shebang行的命令,它將視爲註釋。通過shebang線連接口譯員是否便攜?
#! /bin/sh
date -R
echo hello world
可能的輸出:
Sat, 01 Apr 2017 12:34:56 +0100
hello world
我曾經相信的解釋器(在這個例子中/bin/sh
)必須是原生可執行文件,不能是一個腳本本身,反過來,將需要另一名口譯員啓動。
但是,我繼續嘗試下面的實驗。
使用保存爲/tmp/interpreter.py
以下啞殼,...
#! /usr/bin/python3
import sys
import subprocess
for script in sys.argv[1:]:
with open(script) as istr:
status = any(
map(
subprocess.call,
map(
str.split,
filter(
lambda s : s and not s.startswith('#'),
map(str.strip, istr)
)
)
)
)
if status:
sys.exit(status)
...並保存爲/tmp/script.xyz
下面的腳本,
#! /tmp/interpreter.py
date -R
echo hello world
...我能夠(使這兩個文件執行後),以執行script.xyz
。
5gon12eder:/tmp> ls -l total 8 -rwxr-x--- 1 5gon12eder 5gon12eder 493 Jun 19 01:01 interpreter.py -rwxr-x--- 1 5gon12eder 5gon12eder 70 Jun 19 01:02 script.xyz 5gon12eder:/tmp> ./script.xyz Mon, 19 Jun 2017 01:07:19 +0200 hello world
這讓我感到驚訝。我甚至能夠通過另一個腳本啓動scrip.xyz
。
那麼,我問的是:
- 是行爲,通過我的實驗觀察到便攜?
- 實驗是否正確進行或者是否存在這種情況不起作用?不同的(類Unix的)操作系統如何?
- 如果被這樣運作的,這是真的,有一個本地可執行,並儘可能調用而言的解釋腳本之間沒有明顯的區別?
謝謝,這篇文章實際上是我實驗的靈感。但由於它似乎與手冊頁mpez0引用的矛盾,我想知道這種說法是否便攜或甚至是真的。 – 5gon12eder
感謝您的更新。這正是我所追求的信息。我係統上的手冊頁(Parabola GNU/Linux)沒有說明這一點。我冒昧地將您的答案的格式稍作修改,以使其更具可讀性。 – 5gon12eder
@ 5gon12eder,這個重新格式化的降價*要好得多。 – agc