Linux / UNIXでファイルを実行するために "./"(ドットスラッシュ)を使用するのはなぜですか?

Linux / UNIXでファイルを実行するために "./"(ドットスラッシュ)を使用するのはなぜですか?

ファイルを実行するためにLinuxを使用するのはなぜですか./filename

ただ他のコマンドのように入力したらどうでしょうかgccls

答え1

リテラルの回答は他の人が提供したものと同じです。現在のディレクトリが$PATH

しかし、なぜ?一言で言えば安全についてです。他の人のホームディレクトリ(または/ tmp)を表示または入力するgccと、いたずらls友達が作成した悪意のあるバージョンではなく、実際のバージョンを実行しているので、すべてのファイルを削除できることがわかります。別の例はtestまたはです[。シェルにこれらのコマンドが組み込まれていない場合は、シェルスクリプトでこれらのコマンドを置き換えることができます。

.〜で持っている最後自分のルートに入る方が安全ですが、それを利用する他の攻撃もあります。これを行う簡単な方法は、slなどの一般的なスペルミスを活用することですls-l。または、そのシステムにインストールされていない一般的なコマンドを見つけます。vimたとえば、システム管理者が平均よりも頻繁にコマンドを入力するためです。

とても理論的に聞こえますか?それ最大はい、しかし実際には特にマルチユーザーシステムでこれが間違いなく起こります。実際、以下は、このウェブサイトの例です。管理者はユーザーのホームディレクトリに切り替えて、psその名前の実行可能ファイルがブロックされていることを見つけます。

答え2

Linux、UNIX、および関連オペレーティングシステムでは、.現在のディレクトリを表します。あなたのディレクトリではなく現在のディレクトリからファイルを実行したいので、実行可能ファイルがどこにあるかシェルに知らせるには$PATH少しのビットが必要です。./したがって、./fooこのディレクトリに名前が付けられた実行可能ファイルを実行することを意味します。foo

あなたはそれを使用することができますtypeまたはwhich$PATH.

答え3

もしそうなら、最初に./が必要なのは、(Windowsとは異なり)現在のディレクトリがデフォルトでパスの一部ではないからです。実行する場合:

$ ls

lsシェルは、PATH環境変数のディレクトリを見て(echo $PATH確認するために)見つけた最初の実行可能ファイルを実行しますls。次のように入力する場合:

$ a.out

シェルは同じことを行いますが、a.outという実行可能ファイルを見つけることができない可能性があります。 a.outがどこにあるかシェルに教えてください。現在のディレクトリ(.)にある場合、パスはです./a.out

なぜ「a.out」と呼ばれるのかを尋ねるなら、それはgccのデフォルトの出力ファイル名にすぎません。 -oコマンドラインパラメータを使用して変更できます。たとえば、

$ gcc test.c -o test
$ ./test

答え4

実際、より完全なルールは次のとおりです。/パスにスラッシュがある場合は検索しないでください。PATH

どのように機能するかを知る前に、まず次のことを理解する必要があります。次のいずれかを実行してください。

bin/someprog

または:

/bin/someprog

または:

cd bin
./myexec

を実行するときに変数をbin/someprog検索する必要はありません。まったく同じ理由でallであり、その中にスラッシュがあります。PATHbin/someprog/bin/someprog./someprog/

someprogaloneにはスラッシュがないので、/でのみ検索しますPATH

POSIX 7以下にこの規則を指定します。http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_01_01

[...]探しているパス名にが含まれている場合は、<slash>パスプレフィックスで検索しないでください。

/POSIX PATH ルールの基本

実行中であると仮定します。

someprog

次を検索します。

  • CWDに関連する最初の
  • 以降のPATH基準

/bin/someprogその後、ディストリビューションで実行するには、次の手順を実行します。

someprog

時には動作しますが、someprog関連していない他のプログラムが含まれているディレクトリにある可能性があるため、失敗することがあります。

したがって、これが信頼できないことがすぐにわかり、PATHを使用したい場合は常に絶対パスを使用することになり、PATHの目的は失われます。

これがPATHに相対パスを含めることが非常に悪い考えである理由です。はいあなたを見ている、node_modules/bin

代わりに、以下を実行するとします。

./someprog

次を検索します。

  • PATHに相対する最初の
  • 以後、CWD基準

その後、someproggitストアからスクリプトをダウンロードしてCWDで実行したい場合は、ディストリビューションに次のものがある可能性があるため、これが実行される実際のプログラムであるかどうかはわかりません。

/bin/someprog

これは、過去のクリスマスに飲みすぎた後にインストールしたいくつかのパッケージのPATHです。

したがって、実行中のエントリを確認するには、フルパスを使用してCWDに基づいて常にローカルスクリプトを実行する必要があります。

"$(pwd)/someprog"

これも非常に面倒なことができます。

考えられるもう一つの規則は次のとおりです。

相対パスはPATHのみを使用し、絶対パスはCWDのみを使用します。

ただし、これにより、ユーザーはPATH以外のスクリプトに常に絶対パスを使用する必要があります"$(pwd)/someprog"

ルート/検索ルールは、情報の問題に対する簡単で覚えやすいソリューションを提供します。

  • スラッシュ:未使用PATH
  • スラッシュなし:単に使用してくださいPATH

これにより、現在のディレクトリ内のファイルを介して./somefile実行されている項目がまたはとして表示されることがあることを常に簡単に知ることができるため、somefileそのうちの1つに特別な意味を与えます。

some/prog時には何かを探すことができず、少し迷惑になることがありますがPATH、よりスマートな解決策は見えません。

関連情報