
私はシェルスクリプトに初めてアクセスし、インタプリタを呼び出すためにスクリプトの先頭に#!(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)を実行するために独自の新しいインスタンスを作成することがあります。
答え2
Magic Lineが提供されていない場合は、デフォルトのシェルを使用してスクリプトを実行します。このデフォルトシェルはBourneシェル(sh)にすることができます。これは一部のバージョンではありますが、他のバージョンでは使用されるデフォルトシェルが実行されているログインシェルと同じです。問題は、システムがシェルを決定するのではなく、常に最初の行に必要なシェルを提供することです。
答え3
次の3つの可能性のうちの1つがあります。
インタプリタIE:bash script.shを使用してスクリプトを直接呼び出します。
スクリプトファイルの名前には拡張子.shがあり、システムがそのファイルを見つけるための基本プログラムになります。
あなたが使用しているシェル環境は、スクリプトファイルが実行可能であると推測できるため、独自に「echo」を実行しています。たとえば、bashシェルを使用する予定で、ファイルにkshでのみ使用されるコマンドがある場合、そのコマンドが機能しないことがわかります。
頑張ってください!