この. executable
構文は、実行可能ファイルだけでは機能しません(または機能しますか?)。代わりに、bash source
ビルトインのエイリアスです。そのため、違いは主にbashスクリプトに関連しており、真実はそれらが完全に異なるものであることです:)
./executable
実行可能ファイルを「通常」実行するよう要求します。./
現在のパスへの相対参照です。これにより、シェル(bash)がその実行可能ファイルをそのディレクトリ内で見つけようとすることを回避できます($PATH
コマンドでパスをまったく指定しなかった場合に実行されます)。どうしてもできないのexecutable
はセキュリティの理由です。ダウンロードしたアーカイブを解凍すると、悪意のあるバージョンのが含まれていますls
。現在のディレクトリから直接実行した場合、気付かないうちにそのバージョンを実行することになります。
一方、. executable
「ファイルのソース」と言っていますexecutable
。ファイルに直接名前を付けており、実際に実行可能ファイルである必要はないため、$ PATHのセキュリティ制限は適用されません。ソーシングは、シェルスクリプトのみを「実行」します(または実行しているように見えます)。それは何ですか:
source filename [arguments]
Read and execute commands from filename in the current shell
environment and return the exit status of the last command exe‐
cuted from filename.
だから...実行と調達の実際の違いは何ですか?同じシェルスクリプトを想定して、それを実行すると(./script
)新しいシェルが生成され、そのシェル内でスクリプトが実行され、スクリプトが終了したらそのシェルを閉じて親シェルに戻ります。実際にはbash
、スクリプトを実行するための新しいプロセスが開始されます)。
(. script
)を使用すると、現在のシェルはコマンドラインに入力されているかのようにファイルからコマンドを読み取ります。生成された新しいシェルはありません。
これがどのように動作するかを確認する非常に簡単な方法は、のみを含むスクリプトを作成することexit
です。もしそうなら./script
、何も起こらないようです。これは、新しいシェルプロセスが開始され、exit
コマンドがその新しいシェルを終了し、現在のシェルが影響を受けないためです。
の場合. script
、exit
コマンドは現在のシェルで実行されるため、現在のターミナルは閉じます。したがってexit
、コマンドプロンプトで入力するのと同じです。