web-dev-qa-db-ja.com

bashで実行するために、実行可能ファイルまたはスクリプト名の前に./(ドットスラッシュ)が必要なのはなぜですか?

Bashでスクリプトを実行する場合、最初に./を記述する必要があります。

$ ./manage.py syncdb

そうしないと、エラーメッセージが表示されます。

$ manage.py syncdb
-bash: manage.py: command not found

この理由は何ですか? .は現在のフォルダーのエイリアスであると考えたため、これら2つの呼び出しは同等である必要があります。

また、次のようなアプリケーションを実行するときに./を必要としない理由もわかりません。

user:/home/user$ cd /usr/bin
user:/usr/bin$ git

./なしで実行されます)

260
Dan Abramov

Unixでは、通常、現在のディレクトリは$PATHにないためです。

コマンドを入力すると、シェルはPATH変数で指定されたディレクトリのリストを検索します。現在のディレクトリはそのリストにありません。

そのリストに現在のディレクトリがない理由はセキュリティです。

あなたがrootで、別のユーザーのディレクトリに移動し、slの代わりにlsと入力したとします。現在のディレクトリがPATHにある場合、シェルはそのディレクトリでslプログラムを実行しようとします(他のslプログラムがないため)。そのslプログラムは悪意がある可能性があります。

POSIX指定./を含むコマンド名がファイル名として直接使用され、/での検索が抑制されるため、$PATHで動作します。まったく同じ効果を得るためにフルパスを使用することもできますが、./は短く、記述しやすいです。

編集

slの部分は単なる例です。 PATH内のディレクトリは順番に検索され、一致が見つかるとそのプログラムが実行されます。そのため、PATHの外観に応じて、通常のコマンドを入力しても、現在のディレクトリでプログラムを実行するのに十分な場合と不十分な場合があります。

283
cnicutar

Bashはコマンドラインを解釈するときに、環境変数$PATHに記述されている場所でコマンドを探します。入力するには、次を入力します。

echo $PATH

コロンで区切られたパスがいくつかあります。ご覧のように、現在のパス.は通常$PATHにはありません。そのため、Bashはコマンドが現在のディレクトリにある場合、コマンドを見つけることができません。次のようにして変更できます。

PATH=$PATH:.

この行は、$PATHに現在のディレクトリを追加するので、次のことができます。

manage.py syncdb

notはセキュリティ上の問題があるため推奨されます。また、.は現在のディレクトリによって異なるため、奇妙な動作をする可能性があります:)

避ける:

PATH=.:$PATH

いくつかの標準コマンドを「マスク」して、セキュリティ侵害への扉を開くことができるように:)

ちょうど私の2セント。

48
neuro

シェルがスクリプトを見つけるために$PATH環境変数を調べても、ホームディレクトリにあるスクリプトは見つかりません。

./には、「$PATHで指定されているすべてのディレクトリを見るのではなく、現在のディレクトリでスクリプトを見る」と書かれています。

39
mdm

「。」を含める場合基本的に、実行可能なbashスクリプトへの「フルパス」を提供しているため、シェルはPATH変数を確認する必要がありません。 「。」なしシェルはPATH変数を調べます(echo $PATHを実行すると、入力したコマンドがPATH上のフォルダーに存在するかどうかを確認できます。存在しない場合(manage.pyの場合) PATHに現在のディレクトリを含めるのは悪い習慣と考えられていますが、これについてはここで十分に説明されています: http://www.faqs.org/faqs/ unix-faq/faq/part2/section-13.html

4
Mark Drago

* nixでは、Windowsとは異なり、現在のディレクトリは通常$PATH変数にありません。そのため、コマンドの実行時に現在のディレクトリは検索されません。これらのアプリケーションareが$ PATHにあるため、アプリケーションの実行に./は必要ありません。ほとんどの場合、/binまたは/usr/binにあります。

2
Anomie

この質問にはすでにいくつかの素晴らしい答えがありますが、実行可能ファイルがPATHにあり、実行時に非常に異なる出力が得られる場合、それを追加したかったです

./executable

あなたが実行した場合に取得するものに

executable

(一方ではなく他方でエラーメッセージが発生したとしましょう)、問題はマシン上に2つの異なるバージョンの実行可能ファイルがあることです:パス上にあるものとそうでないもの。

実行してこれを確認してください

どの実行可能ファイル

そして

whereis executable

それは私の問題を修正しました...私は実行可能ファイルの3つのバージョンを持っていました、そのうちの1つだけが環境のために正しくコンパイルされました。

1
KR_Henninger

スクリプトがパスにない場合、そのために必要です。詳細については、 http://www.tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_01.html

0
Gayan Hewa