Bashのマニュアルから:
3.7.2 命令の検索と実行
コマンドを単語に分割して単純なコマンドとオプションのパラメータリストを生成すると、次のことが行われます。
...
名前がシェル関数でも組み込み関数でもなく、スラッシュを含まない場合、Bashは$ PATHの各要素を検索して、その名前の実行可能ファイルを含むディレクトリを見つけます。
検索が成功した場合、またはコマンド名に少なくとも1つのスラッシュが含まれている場合、シェルは別の実行環境で指定されたプログラムを実行します。パラメーター0は指定された名前に設定され、コマンドの残りのパラメーターは指定されたパラメーター(存在する場合)に設定されます。
ファイルが実行可能な形式ではないか、ディレクトリでないために実行に失敗した場合、シェルスクリプトだとするとそしてシェルは、39ページの3.8節「シェルスクリプト」の説明に従って実行します。
bashスクリプトに
myscript
shebangが含まれていないとします。引用文は、スクリプトがコマンドを介してbashで実行されると、次のことを意味しますか
myscript
?bashは最初にELFと仮定して呼び出します
execve()
。 ELFではなくbashスクリプトなので、execve()
呼び出しは失敗します。bashは次回実行されますか
bash myscript
?
bashでbashスクリプトを実行するのと比較すると、
bash myscript
bashでスクリプトを実行するとスクリプトmyscript
直接呼び出しが失敗しますかexecve()
?それでは、
myscript
より遅いですかbash myscript
?なぜ」Mark G. Sobell の Linux コマンド、エディタ、シェルプログラミングに関する実用ガイド「なんかこっそり言ってる?bashを使用してシェルスクリプトを実行できますが、この手法を使用すると、自分に実行権限を付与してスクリプトを直接呼び出すよりも、スクリプトが遅くなります。
bash スクリプトに
myscript
shebang が含まれている場合 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は最初にELFと仮定して呼び出します
bashでbash myscriptを介してbashスクリプトを実行するのと比較して、bashからmyscriptを介してスクリプトを実行すると、スクリプト呼び出しは直接失敗しますか
execve()
?はい、「失敗した通貨」を意味する場合はそうです。
それでは、
myscript
より遅いですかbash myscript
? 「Mark G. SobellのLinuxコマンド、エディタ、シェルプログラミングの実用ガイド」が反対だと言うのはなぜですか?bashを使用してシェルスクリプトを実行できますが、この手法を使用すると、自分に実行権限を付与してスクリプトを直接呼び出すよりも、スクリプトが遅くなります。
bash
現在の名誉毀損法を考えると、質問の2番目の部分については言及しませんが、いくつかの失敗したライブラリやシステムコールでも、プロセス全体を開始して比較することと比較して測定可能な違いはありません。解釈スクリプト。見逃した可能性があるコンテキストを見つけるために関連ページにアクセスすることはできません。しかし、やることがない場合は議論しないことがほぼ確実である。
bash スクリプトに
myscript
shebang が含まれている場合 bash で次のコマンドを#! /bin/bash
実行するときmyscript
- commandを介してbashと同じように実行されますか
bash myscript
?
はい、ある場合はshebang行が子プロセスによって直接
bash myscript
編集されexec
、他の場合はシステムがexec
shebang行を見つけたときに編集します。/bin/bash myscript
- スクリプトからshebangを削除してから、コマンドを介してスクリプトを実行するのと同じ方法で実行されますか
myscript
?
合理的に検出できる限り、そうです。これらのどれも重要ではありません。厳密に言えば、この場合、
main()
関数はbash
再実行されません。なぜなら、子プロセスは内部的にそれ自体で再初期化され、他の場合には実行されるからです。本当に興味があれば、これは重要なシナリオを構成できますが、努力する価値はありません。- commandを介してbashと同じように実行されますか
これは Bash 関数です。sh
その他のシェル shebangless スクリプトを実行するには、または別のシェルを使用します。bash
、あなたがリンクした他の質問に記載されているように、それらの1つではなく、自分自身でもありません。また、対話型シェルがbash
shebang行のものと同じであると仮定します。