Shebangがあるかどうかにかかわらず、ファイル名でコマンド名でbashスクリプトをどのように実行できますか?

Shebangがあるかどうかにかかわらず、ファイル名でコマンド名でbashスクリプトをどのように実行できますか?

Bashのマニュアルから:

3.7.2 命令の検索と実行

コマンドを単語に分割して単純なコマンドとオプションのパラメータリストを生成すると、次のことが行われます。

...

  1. 名前がシェル関数でも組み込み関数でもなく、スラッシュを含まない場合、Bashは$ PATHの各要素を検索して、その名前の実行可能ファイルを含むディレクトリを見つけます。

  2. 検索が成功した場合、またはコマンド名に少なくとも1つのスラッシュが含まれている場合、シェルは別の実行環境で指定されたプログラムを実行します。パラメーター0は指定された名前に設定され、コマンドの残りのパラメーターは指定されたパラメーター(存在する場合)に設定されます。

  3. ファイルが実行可能な形式ではないか、ディレクトリでないために実行に失敗した場合、シェルスクリプトだとするとそしてシェルは、39ページの3.8節「シェルスクリプト」の説明に従って実行します。

  1. bashスクリプトにmyscriptshebangが含まれていないとします。

    • 引用文は、スクリプトがコマンドを介してbashで実行されると、次のことを意味しますかmyscript

      • bashは最初にELFと仮定して呼び出しますexecve()。 ELFではなくbashスクリプトなので、execve()呼び出しは失敗します。

      • bashは次回実行されますかbash myscript

    • bashでbashスクリプトを実行するのと比較すると、bash myscriptbashでスクリプトを実行するとスクリプトmyscript直接呼び出しが失敗しますかexecve()

    • それでは、myscriptより遅いですかbash myscript?なぜ」Mark G. Sobell の Linux コマンド、エディタ、シェルプログラミングに関する実用ガイド「なんかこっそり言ってる?

      bashを使用してシェルスクリプトを実行できますが、この手法を使用すると、自分に実行権限を付与してスクリプトを直接呼び出すよりも、スクリプトが遅くなります。

  2. bash スクリプトにmyscriptshebang が含まれている場合 bash で次のコマンドを#! /bin/bash実行するときmyscript

    • commandを介してbashと同じように実行されますかbash myscript

    • スクリプトからshebangを削除してから、コマンドを介してスクリプトを実行するのと同じ方法で実行されますかmyscript

ありがとうございます。

私の投稿は以下からインスピレーションを得ました。実行可能ファイルのようにスクリプトを実行することとシェルを介して明示的に実行することの違いは何ですか?そしてShebangなしでスクリプトを実行するシェルインタプリタとは何ですか?

答え1

    • 引用文は、スクリプトがmyscriptコマンドを介してbashで実行された場合、次のことを意味しますか?

      • bashは最初にELFと仮定して呼び出しますexecve()。 ELFではなくbashスクリプトなので、execve()呼び出しは失敗します。

      Bashが実行可能ファイルを見つけたら、まずそのファイルがオペレーティングシステムで実行できる形式であるとします。execve呼ぶ。成功しても、まだELFやその他のデフォルトの実行可能ファイルではない可能性があります。例えば、Linuxbinfmt_misc機能を使用すると、他の多くの実行可能ファイル形式を実行できます。この特別なケースでは、execve呼び出しが失敗する可能性が高いです。

      • bashは次回実行されますかbash myscript

      Bash は既存のサブプロセスを使用して内部スクリプトを実行し、必要に応じてシェル環境を再初期化します。。他のプロセスは開始またはexec呼び出されません。

    • bashでbash myscriptを介してbashスクリプトを実行するのと比較して、bashからmyscriptを介してスクリプトを実行すると、スクリプト呼び出しは直接失敗しますかexecve()

      はい、「失敗した通貨」を意味する場合はそうです。

    • それでは、myscriptより遅いですかbash myscript? 「Mark G. SobellのLinuxコマンド、エディタ、シェルプログラミングの実用ガイド」が反対だと言うのはなぜですか?

      bashを使用してシェルスクリプトを実行できますが、この手法を使用すると、自分に実行権限を付与してスクリプトを直接呼び出すよりも、スクリプトが遅くなります。

      bash現在の名誉毀損法を考えると、質問の2番目の部分については言及しませんが、いくつかの失敗したライブラリやシステムコールでも、プロセス全体を開始して比較することと比較して測定可能な違いはありません。解釈スクリプト。見逃した可能性があるコンテキストを見つけるために関連ページにアクセスすることはできません。しかし、やることがない場合は議論しないことがほぼ確実である。

  1. bash スクリプトにmyscriptshebang が含まれている場合 bash で次のコマンドを#! /bin/bash実行するときmyscript

    • commandを介してbashと同じように実行されますかbash myscript

    はい、ある場合はshebang行が子プロセスによって直接bash myscript編集されexec、他の場合はシステムがexecshebang行を見つけたときに編集します。/bin/bash myscript

    • スクリプトからshebangを削除してから、コマンドを介してスクリプトを実行するのと同じ方法で実行されますかmyscript

    合理的に検出できる限り、そうです。これらのどれも重要ではありません。厳密に言えば、この場合、main()関数はbash再実行されません。なぜなら、子プロセスは内部的にそれ自体で再初期化され、他の場合には実行されるからです。本当に興味があれば、これは重要なシナリオを構成できますが、努力する価値はありません。

これは Bash 関数です。shその他のシェル shebangless スクリプトを実行するには、または別のシェルを使用します。bash、あなたがリンクした他の質問に記載されているように、それらの1つではなく、自分自身でもありません。また、対話型シェルがbashshebang行のものと同じであると仮定します。

関連情報