「./」を使用してファイルを実行するのはなぜですか?


84

なぜ./filenameLinuxでファイルを実行するのに使用するのですか?

理由だけではなく、他のコマンドのようにそれを入力していないgcclsなど...


最初の行は、「なぜlinuxでコマンド./command_nameを実行するために使用するのですか?」

回答:


78

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

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


5
現在のディレクトリでプログラムを実行することは非常に一般的です。なぜシェルもそこを検索しないのですか?最初に。で検索し、次に$ PATHで検索します。
マイケル

aliasだけでなく、邪魔になるes もあります$PATH
user2485710

18
@Michaelのセキュリティと健全性:.最初に検索した場合、セキュリティの問題になります。lsたとえば、あなたや他の人が置き換えることができます(単純なウイルス/トロイエン:ls誰かが検索しているときに、 、彼らはこの実行可能ファイルを実行します…)。.最後に検索した場合、プログラムがなぜ機能していないのかわからずに長い時間を費やすことができます(たとえば、プログラムを実行する代わりにtestというプログラムを作成すると、システムテストプログラムが実行されます。出力は生成されません)。
ctrl-alt-delor

また、パスにアプリケーションまたはスクリプトが複数回出現する場合、実行するバージョン(ここでは "。"ディレクトリにあるバージョン)を実行していることを確認します。
Jim2B

export PATH="$PATH:."PATHのどこにも見つからない場合は、現在のディレクトリでコマンドを実行するために実行できます。これを.bashrcファイルに追加できます
-jcubic

99

他の人が与えたとしてリテラルの答えは次のとおりです。現在のディレクトリは、あなたの中ではないので$PATH

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

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


5
誰かがこれに少し慣れる実用的な例:unix.stackexchange.com/questions/7767
mattdm

PATH環境変数に絶対パスがあるだけです。
エドはヒール

45

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

$ ls

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

$ a.out

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

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

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

Thanks.My疑いは、なぜあなたが必要なのか./開始時に....私は「。」の使用を得た (現在のディレクトリを作成するため)しかし、なぜその後「/」?
レンジットG

8
/はLinuxのパス区切り文字なので、これを使用してディレクトリ(。)をファイル名(a.out)から分離します。それなしでは、それ自体で有効なファイル名である.a.outがあります。(touch .a.out; ls -lAこれを見てみてください。)
サイモン・ウィテカー

5
それはあなたがUnixのでパスを指定し、どのようにある<dir>/<file>ので、あなたは、基本的に示されている現在のディレクトリにファイルを実行すると言っている./test
ロハンモンガ

i686上のRed Hat Linuxリリース9(Shrike)カーネル2.4.20-8 [renjithg @ cvsserver renjithg] $ touch .a.out; ls -lA合計3 -rw-rw-r-- 1 renjithg renjithg 0 Nov 30 13 :46 .a.out -rwxrwxr-x 1 renjithg renjithg 11669 Nov 30 13:46 a.out -rw-rw-r-- 1 renjithg renjithg 218 2009年8月24日aray.c [renjithg @ cvsserver renjithg] $
Renjith G

3
Red Hat Linux 9?アップグレードの時間です!
mattdm

4

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

Alt / F2を試して、次のgksudo gedit /etc/environmentように入力します。Linux/ GTKを実行している場合(これはUbuntuを使用している場合の設定です)。

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

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

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

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

./someProgram.sh 現在のディレクトリで実行可能プログラムsomeProgram.shを実行するために入力するものです。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.