Bashでスクリプトを実行する場合、最初に./
を記述する必要があります。
$ ./manage.py syncdb
そうしないと、エラーメッセージが表示されます。
$ manage.py syncdb
-bash: manage.py: command not found
この理由は何ですか? .
は現在のフォルダーのエイリアスであると考えたため、これら2つの呼び出しは同等である必要があります。
また、次のようなアプリケーションを実行するときに./
を必要としない理由もわかりません。
user:/home/user$ cd /usr/bin
user:/usr/bin$ git
(./
なしで実行されます)
Unixでは、通常、現在のディレクトリは$PATH
にないためです。
コマンドを入力すると、シェルはPATH
変数で指定されたディレクトリのリストを検索します。現在のディレクトリはそのリストにありません。
そのリストに現在のディレクトリがない理由はセキュリティです。
あなたがrootで、別のユーザーのディレクトリに移動し、sl
の代わりにls
と入力したとします。現在のディレクトリがPATH
にある場合、シェルはそのディレクトリでsl
プログラムを実行しようとします(他のsl
プログラムがないため)。そのsl
プログラムは悪意がある可能性があります。
POSIX指定./
を含むコマンド名がファイル名として直接使用され、/
での検索が抑制されるため、$PATH
で動作します。まったく同じ効果を得るためにフルパスを使用することもできますが、./
は短く、記述しやすいです。
編集
sl
の部分は単なる例です。 PATH
内のディレクトリは順番に検索され、一致が見つかるとそのプログラムが実行されます。そのため、PATH
の外観に応じて、通常のコマンドを入力しても、現在のディレクトリでプログラムを実行するのに十分な場合と不十分な場合があります。
Bashはコマンドラインを解釈するときに、環境変数$PATH
に記述されている場所でコマンドを探します。入力するには、次を入力します。
echo $PATH
コロンで区切られたパスがいくつかあります。ご覧のように、現在のパス.
は通常$PATH
にはありません。そのため、Bashはコマンドが現在のディレクトリにある場合、コマンドを見つけることができません。次のようにして変更できます。
PATH=$PATH:.
この行は、$PATH
に現在のディレクトリを追加するので、次のことができます。
manage.py syncdb
notはセキュリティ上の問題があるため推奨されます。また、.
は現在のディレクトリによって異なるため、奇妙な動作をする可能性があります:)
避ける:
PATH=.:$PATH
いくつかの標準コマンドを「マスク」して、セキュリティ侵害への扉を開くことができるように:)
ちょうど私の2セント。
シェルがスクリプトを見つけるために$PATH
環境変数を調べても、ホームディレクトリにあるスクリプトは見つかりません。
./
には、「$PATH
で指定されているすべてのディレクトリを見るのではなく、現在のディレクトリでスクリプトを見る」と書かれています。
「。」を含める場合基本的に、実行可能なbashスクリプトへの「フルパス」を提供しているため、シェルはPATH変数を確認する必要がありません。 「。」なしシェルはPATH変数を調べます(echo $PATH
を実行すると、入力したコマンドがPATH上のフォルダーに存在するかどうかを確認できます。存在しない場合(manage.pyの場合) PATHに現在のディレクトリを含めるのは悪い習慣と考えられていますが、これについてはここで十分に説明されています: http://www.faqs.org/faqs/ unix-faq/faq/part2/section-13.html
* nixでは、Windowsとは異なり、現在のディレクトリは通常$PATH
変数にありません。そのため、コマンドの実行時に現在のディレクトリは検索されません。これらのアプリケーションareが$ PATHにあるため、アプリケーションの実行に./
は必要ありません。ほとんどの場合、/bin
または/usr/bin
にあります。
この質問にはすでにいくつかの素晴らしい答えがありますが、実行可能ファイルがPATHにあり、実行時に非常に異なる出力が得られる場合、それを追加したかったです
./executable
あなたが実行した場合に取得するものに
executable
(一方ではなく他方でエラーメッセージが発生したとしましょう)、問題はマシン上に2つの異なるバージョンの実行可能ファイルがあることです:パス上にあるものとそうでないもの。
実行してこれを確認してください
どの実行可能ファイル
そして
whereis executable
それは私の問題を修正しました...私は実行可能ファイルの3つのバージョンを持っていました、そのうちの1つだけが環境のために正しくコンパイルされました。
スクリプトがパスにない場合、そのために必要です。詳細については、 http://www.tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_01.html