foo という名前のプログラムがある場合、単に foo ではなく ./foo と指定する必要があるのはなぜですか? ./ は現在のディレクトリ内だけを意味するのではないですか?
答え1
例えば、コマンドだけを入力すると、foo
シェル(通常はbash
)は特定のディレクトリ(/bin、/usr/bin、/usr/X11R6/binなど)のみを検索します。通常はないセキュリティ上の懸念から、「現在のディレクトリ」(つまり「.」)を参照してください(特にもしあなたが〜なら根)。「.」を追加する場合は、の終わり検索パス。
実行ファイルを実行したい場合は、ないこの検索パスでは、コマンドへの絶対パスまたは相対パス全体を指定する必要があります。例:
/home/bok/foo # Absolute in my homedir
~/src/bar # Shorthand for my homedir and a subdir in it
../Download/foobar # Relative path – up one step, then down in Download
または、コマンドが現在のディレクトリにある場合は、単に./
:を追加します。
./foo
検索パスはbash
、パス環境変数なので、次のように入力すると確認できます。
echo $PATH
「.」を追加するには、すべきではないdo – 入力:
export PATH="$PATH:."
PATH は順番に検索されるため、異なるディレクトリに同じ名前の実行可能ファイルが複数ある場合、シェルは PATH の最初のディレクトリにある実行可能ファイルを実行します。
まず、リストされているすべてのディレクトリを調べた後、「コマンドが見つかりません」というエラーが表示されます。
+++
現在のディレクトリを PATH に追加することの問題.
は、たまたまいる「非標準」ディレクトリ内の実行可能ファイルが実行されるかどうかが実際にはわからないことです。
私が悪者で、できるだけ多くのファイルを削除してホーム ディレクトリ (または、もっとひどい場合は /tmp) に残す破壊的なプログラムを作成したとします。私はこのプログラムを (よくsl
あるミス タイプ)ls
と呼んで待機します。
ls
あるランダムなユーザーが /tmp にいて、.を間違って入力しましたsl
。通常の PATH では、. なしでは何も起こりませんが、「コマンドが見つかりません」というエラーが表示されます。PATH の末尾に '.' がある場合は、コマンドを入力してもエラーは表示されません。代わりに、私のsl
コマンドが実行され、そのユーザーが所有するすべてのファイルが削除されます。根このコマンドはシステムの大半を削除できます。(これが根 本当にそうすべきルールにするいつも使用フルパスPATH を信頼するのではなく、コマンドを実行します。
もし彼がPATHの先頭に「.」を置いていて、私がls
(正しい綴り)というプログラムを作成してディレクトリに置いたとしたら、私のプログラム(通常ではない)は、そのディレクトリにls
入力した場合に実行されます。現在のディレクトリ(.)を参照するためです。ls
bash
初め– 本物のシステムディレクトリを調べる前にls
。