あるインタビューで、シェル スクリプトに関する非常に基本的な質問に出くわしましたが、それに対する答えが見つかりませんでした。質問: スクリプトの最初の行が「#!/bin/ksh」の場合、bash で実行できますか?
私の答えはノーでした。スクリプトの最初の行にディレクティブを含める理由は、どのインタープリターを使用する必要があるかを伝えるためです。しかし、この質問に対するインタビュアーの答えはイエスでした。誰か私に理由を説明できますか?
はい、次のことができます。
bash yourscript
もちろん、言語固有の機能がある場合は、いくつかのエラーがスローされます。しかし、質問はそれが正しく機能するかどうかを指定していませんでした。
からman bash
:
最初の引数は、シェル コマンドを含むファイルの名前であると見なされます。この方法で bash が呼び出されると、$0 がファイルの名前に設定され、位置パラメーターが残りの引数に設定されます。Bash は、このファイルからコマンドを読み取って実行し、終了します。Bash の終了ステータスは、スクリプトで実行された最後のコマンドの終了ステータスです。コマンドが実行されない場合、終了ステータスは 0 です。最初に現在のディレクトリでファイルを開こうとします。ファイルが見つからない場合、シェルは PATH 内のディレクトリでスクリプトを検索します。
実際、それはまさにプログラムローダーがやろうとしていることです。ウィキペディアのシバンの記事からの引用は次のとおりです。
Unix ライクなオペレーティング システムでは、シバンを含むスクリプトがプログラムとして実行されると、プログラム ローダーはスクリプトの最初の行の残りをインタープリター ディレクティブとして解析します。指定されたインタープリター プログラムが代わりに実行され、スクリプトを実行しようとしたときに最初に使用されたパスが引数として渡されます。たとえば、スクリプトがパス「path/to/script」で命名され、次の行で始まるとします。
#!/ビン/sh
次に、プログラム ローダーは代わりにプログラム "/bin/sh" を実行するように指示され (通常、これは Bourne シェルまたは互換シェルです)、最初の引数として "path/to/script" を渡します。
彼らが言うならOh, but can you execute it in bash just by using ./script ?
、答えはイエスです。bash を削除/bin/ksh
して、同じパスにコピー (またはリンク) します。ターダー!ただし、ルート権限が必要になる場合があります。