2010-11-27 64 views
1

看起來好像腳本帶#!前綴可以具有解釋器名稱和只有一個參數。因此:限制#!在腳本中

#!/bin/ls -l 

作品,但

#!/usr/bin/env ls -l 

你同意嗎?有什麼想法嗎?

Francesc

回答

2

不同的Unix解釋#!不同。這裏有一個全面的看法:http://www.in-ulm.de/~mascheck/various/shebang/

跨越平臺的最低公因數似乎是「解釋器(它本身不應該是一個腳本)和不超過一個參數」。

+0

非常明確的答案,謝謝 – francesc 2010-11-27 22:58:55

-1

最初,我們在Unix上只有一個shell。當你要求運行一個命令時,shell會嘗試調用其中的一個exec()系統調用。它的命令是一個可執行文件,exec會成功,命令將運行。如果exec()失敗,那麼shell不會放棄,相反它會嘗試將命令文件解釋爲它是一個shell腳本。

然後unix有更多的炮彈,情況變得困惑。大多數人會在一個shell中編寫腳本,並在另一個shell中輸入命令。每個shell都有不同的將腳本提供給解釋器的規則。

這是「#! /「技巧被髮明。這個想法是讓內核的exec()系統調用通過shell腳本獲得成功。當內核嘗試exec()一個文件時,它會查看前4個字節,它們表示一個稱爲幻數的整數。這告訴內核它是否應該嘗試運行該文件。所以「#! /「被添加到內核知道的幻數中,並且它被擴展爲實際上能夠自行運行shell腳本。但有些人不能輸入「#! /「,他們一直留下空間。因此內核再次花費了一些時間來允許「#!/」作爲特殊的3字節幻數。