2010-11-27 3 views
1

#があるスクリプトはそうです!接頭辞はインタプリタ名と1つの引数のみを持つことができます。したがって:#の制限!スクリプトの中で

#!/bin/ls -l 

作品が、

#!/usr/bin/env ls -l 

あなたは

を同意しますしないのですか?何かご意見は?

Francesc

答えて

2

異なるUnixesが#を解釈します。異なっている。 http://www.in-ulm.de/~mascheck/various/shebang/

プラットホーム間の最小公約数は、 "インタプリタ(それ自体はスクリプトではない)と複数の引数"であると思われます。

+0

非常に明確な答え、ありがとう – francesc

-1

元々、UNIX上には1つのシェルしかありませんでした。コマンドを実行するように頼んだら、シェルはexec()システムコールの1つを起動しようとします。コマンドが実行可能ファイルだった場合、execは成功し、コマンドが実行されます。 exec()が失敗した場合、シェルはあきらめず、シェルスクリプトのようにコマンドファイルを解釈しようとします。

その後、UNIXがさらにシェルを獲得し、状況が混乱しました。ほとんどの人は、あるシェルにスクリプトを書いて、別のシェルにコマンドを入力します。そして各シェルには、スクリプトをインタプリタに渡すための異なる規則がありました。

これは、「#!/"トリックが発明されました。その考えは、カーネルのex​​ec()システムコールをシェルスクリプトで成功させることでした。カーネルがファイルをexec()しようとすると、マジックナンバーと呼ばれる整数を表す最初の4バイトを調べます。これは、ファイルを実行しようとするかどうかをカーネルに伝えます。そう "#!カーネルが知っているマジックナンバーに "/"が追加され、シェルスクリプト自体を実際に実行できるように拡張されました。しかし、「#!/"、彼らはスペースを残し続けた。だから、カーネルはもう一度消耗して "#!/"が特殊な3バイトのマジックナンバーとして動作するようにしました。