./ vs。端末でプログラムを実行するための


13

ターミナルの下で実行可能ファイルを実行する方法について、明確にする必要があります。これは、ラメの質問かもしれませんが、と実行可能ファイルを実行しているとの違いは何である./an_executable. an_executable(我々はan_executableが配置されているディレクトリにあると仮定してみましょうが)

前者がシェルに現在のディレクトリ(.)でan_executableを検索させることは既に知っていますが、後者のバージョンを使用した/後、なぜ必要ないの.ですか?

前もって感謝します。


回答:


22

この. 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コマンドがその新しいシェルを終了し、現在のシェルが影響を受けないためです。

の場合. scriptexitコマンドは現在のシェルで実行されるため、現在のターミナルは閉じます。したがってexit、コマンドプロンプトで入力するのと同じです。


実際、この動作に気付いたとき、私はシェルスクリプトを扱っていました。どうもありがとう、それが私が必要とした答えです。:)
zipzap

別の質問があります(気にしない場合):私のスクリプトにエコー付きの単純なメッセージが含まれていて、。/ scriptで実行している場合、サブシェルが閉じた場合に親シェルでメッセージを表示できるのはなぜですか実行が終了するとすぐに?
zipzap

2
サブシェルは独立したプロセスであるため、呼び出しシェルと同じ端末を使用するためです。これは、まだls出力を表示できる方法に似ています。コマンドを入力して実行し、出力を表示してから終了しますが、出力はターミナルに残ります。
-roadmr

2
シェルとターミナルを混同しないでください。それらは異なるものです。ターミナルを開くと、コマンドプロンプトはbashその中で実行されているシェルによって表示されます。を入力するとbash別のシェルが実行されます。最初のシェルまでは、実行するプログラムです。を入力するexitと、最後に起動したシェルを閉じますが、最初のシェル(ターミナルを起動したときのシェル)のままです。繰り返しますが、これはすべて同じ端末内で発生します。
roadmr

1
@DavidZ私はそれについて言及しました:)「ソーシングはシェルスクリプトのみを「実行」(または実行するように思われます)。
-roadmr
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.