私はシェルスクリプトに初めてアクセスし、インタプリタを呼び出すためにスクリプトの先頭に#!(sha-bang)行を使用する方法についての多くの本が書かれています。これにより、スクリプトの新しいシェルが呼び出され、1行ずつ解釈されます。しかし、私のデフォルトスクリプトはまだマジックラインなしで実行されています。
だから私の質問は次のようになります
- 私のデフォルトのスクリプトはどこから通訳を取得します。
- スクリプトはインタプリタをどのように検索しますか?
それでは、次の行だけを含む基本スクリプトを紹介します。
echo "マジックラインのない基本スクリプト"
ベストアンサー1
プログラムを実行すると、カーネルはそのプログラムがどのプログラムによって開始されたかを確認します。マジックバイトシーケンス。実行可能ファイルがで始まると、#!
カーネルは残りの行をインタプリタ名として解釈します。実行可能ファイルが\177ELF
(\177
バイト127)で始まる場合、ファイルは次のようにロードされます。非常に低い周波数実行可能ファイル。これは、今日のほとんどのUNIXシステムでは一般的なタイプです。
カーネルがファイル形式を認識しない場合は、ファイルの実行を拒否し、EXEC(Execution Format Error)エラーを返します。シェルがそれを見つけたら、プログラム自体をシェルスクリプトとして実行します。
これを確認するには、スクリプトにいくつかのコマンドを追加してください。
ps l $$
ls -l /proc/$$/exe
echo hello
(これはLinux用ですので、他のUnixに合わせて調整してください。)次に、さまざまなシェルでスクリプトを実行してみてください。一部のシェルは、スクリプト(bash、ksh93)とは異なるシェル/bin/sh
(dash、pdksh、zsh)を実行するために独自の新しいインスタンスを作成することがあります。