web-dev-qa-db-ja.com

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

なぜ./filename Linuxでファイルを実行するには?

他のコマンドgcclsなどのように入力するだけではどうですか。

89
Renjith G

Linux、UNIX、および関連オペレーティングシステムでは、.は現在のディレクトリを示します。現在のディレクトリでファイルを実行したいが、そのディレクトリが$PATHにないため、実行可能ファイルの場所をシェルに伝えるには./ビットが必要です。したがって、./fooは、このディレクトリにあるfooという実行可能ファイルを実行することを意味します。

type または which を使用して、$PATHにあるコマンドの完全パスを取得できます。

80
badp

文字通りの答えは、他の人が示したとおりです。現在のディレクトリが$PATHにないためです。

しかしなぜ?要するに、それはセキュリティのためです。他の人のホームディレクトリ(または/ tmp)を調べてgccまたはlsと入力すると、悪意のあるバージョンではなく、実際のディレクトリを実行していることを知りたいいたずら友達があなたのすべてのファイルを消去することを書いた。別の例はtestまたは[で、シェルに組み込みのコマンドがない場合、シェルスクリプトのコマンドをオーバーライドする可能性があります。

パスのlastエントリとして.を使用することは少し安全ですが、それを利用する他の攻撃もあります。簡単なのは、slls-lなどの一般的なタイプミスを悪用することです。または、たまたまこのシステムにインストールされていない一般的なコマンドを見つけます—たとえば、vim。これは、sysadminsが入力する可能性が平均より高いためです。

103
mattdm

つまり、なぜ最初に./が必要なのですか-これは(Windowsとは異なり)、デフォルトでは現在のディレクトリがパスの一部ではないためです。実行すると:

$ ls

シェルはPATH環境変数(それを表示するにはecho $PATH)内のディレクトリでlsを探し、検出したlsという最初の実行可能ファイルを実行します。入力した場合:

$ a.out

シェルも同様に動作しますが、おそらくa.outという実行可能ファイルは見つかりません。シェルにa.outの場所を通知する必要があります-それは現在のディレクトリ(。)にあり、パスは./a.outです。

「a.out」と呼ばれる理由を尋ねる場合、それはgccのデフォルトの出力ファイル名にすぎません。 -oコマンドライン引数を使用して変更できます。例えば:

$ gcc test.c -o test
$ ./test
45
Simon Whitaker

$ PATH変数に:.を追加してみてください。

Linux/GTKを実行している場合は、ALT + F2を入力して次のように入力します(Ubuntuを使用している場合はgksudo gedit /etc/environment)。

ただし、これを行わないことを強くお勧めします。それは悪い悪い悪い悪いです。

1970年以降、この種の機能はこのように機能します。現在のディレクトリが$ PATHに含まれていないのには理由があります。

.は現在のディレクトリです

.somethingは隠しファイルです(「ALT +」と入力してNautilusに表示するか、「ls -la」を試してください。

./someProgram.shは、現在のディレクトリで実行可能なsomeProgram.shを実行するために入力するものです。

.somethingElseは、現在のディレクトリに隠し実行可能ファイルがあることを意味しますが、これは悪い考えです。

4
tiktak

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

根拠に入る前に、まずこの事実について知っておく必要があります。

bin/someprog

または:

/bin/someprog

または:

cd bin
./myexec

まったく同じ理由で、PATH変数を検索せずにbin/someprogを実行します。bin/someprog/bin/someprog、および./someprogにはすべて、スラッシュ/が含まれています。

someprogだけではスラッシュ/がないため、PATHのみを検索します。

POSIX 7 は、このルールを http://pubs.opengroup.org/onlinepubs/9699919799/utilitiesで指定します/V3_chap02.html#tag_18_09_01_01

/ POSIX PATHルールの根拠

次のように実行するとします:

someprog

検索します:

  • 最初にCWDを基準
  • 後のPATHを基準

次に、ディストリビューションから/bin/someprogを実行する場合、次のようにします。

someprog

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

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

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

逆に、以下を実行するとします。

./someprog

検索します:

  • 最初にPATHを基準に
  • 後のCWDを基準

次に、スクリプトsomeprogをgitリポジトリからダウンロードしてCWDから実行したい場合、これが実際に実行されるプログラムであるかどうか確信が持てません。

/bin/someprog

これは、昨年のクリスマスの後に飲みすぎた後にインストールしたパッケージのPATHに含まれています。

したがって、繰り返しますが、実行しているものを知るために、フルパスを使用してCWDに相対的なローカルスクリプトを常に実行する必要があります。

"$(pwd)/someprog"

これも非常に煩わしいでしょう。

思いつきそうなもう1つのルールは次のとおりです。

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

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

/パス検索ルールは、about問題の覚えやすい解決策を提供します。

  • スラッシュ:PATHは使用しないでください
  • スラッシュなし:PATHのみを使用

これにより、現在のディレクトリ内のファイルは./somefileまたはsomefileのいずれかとして表現できるという事実に依存することで、実行中の内容を常に非常に簡単に知ることができるため、それらの1つに特別な意味を与えます。

時々、PATHに対してsome/progを検索できないのは少し面倒ですが、これに対するより正解はありません。