Subject: What's wrong with having '.' in your $PATH ?
Date: Thu Mar 18 17:16:55 EST 1993

2.13) $PATH に '.' を入れると、どんな不都合が起こるのですか。

少し補足: 環境変数 PATH はコロンで区切られたディレクトリのリストです。 明示的にパスを与えないでコマンド名を入力したとします (例えば "bin/ls" ではなく "ls" と入力)。するとシェルは PATH のリストの各ディレクトリを、 リストに書いてある順番に、そのコマンド名で実行可能なファイルを探します。 そして見つけた最初のプログラムを実行するでしょう。

PATH リストの中の一つのディレクトリは、カレントディレクトリ "." であっ ても構いません。カレントディレクトリを指定するために PATH リストの中で 空のディレクトリ名を使用するのも許されます。これらは互いに同等です。

csh のユーザーなら:
    
setenv PATH :/usr/ucb:/bin:/usr/bin
setenv PATH .:/usr/ucb:/bin:/usr/bin

sh か ksh のユーザーなら:
    
PATH=:/usr/ucb:/bin:/usr/bin export PATH
PATH=.:/usr/ucb:/bin:/usr/bin export PATH
PATH のどこかに "." を入れると便利です。カレントディレクトリのプログラ ムを実行する時、"./a.out" の代わりに "a.out" と入力することができます。 しかしそこには落し穴があります。

"." が PATH の最初にある場合に何が起こるか考えます。カレントディレクト リは "/tmp" のようにだれでも書き込めるとしましょう。もし、たまたま誰か 違うユーザーが残した "/tmp/ls" と言う名前のプログラムがあったとします。 そしてその時 (もちろん普通の "/bin/ls" プログラムを走らせるつもりで) "ls" と入力すると 、シェルは他のユーザーが作ったプログラムの "./ls" を 代わりに走らせるでしょう。すると言うまでもなく、このような見知らぬプロ グラムを実行してしまい驚くことでしょう。

"." が PATH の最後にあると、少し良いです。

setenv PATH /usr/ucb:/bin:/usr/bin:.
/tmp で "ls" を入力するとシェルは "ls" という名前のプログラムを探しま すが、今度は "." の中を探そうとする前に /usr/ucb, /bin, /usr/bin を見 るでしょう。すると誰か他のユーザーの作った "ls" というプログラムを不注 意に実行する危険は少なくなります。とは言うものの、これは 100% 安全な訳 ではありません。あなたが不器用なタイピストで、いつか "ls -l" の代りに "sl -l" と打ち込んだとしたら "./sl" を実行するという危険を冒します。 "./sl" というプログラムが存在すればの話ですが。"賢い" プログラマーの中 には、ありふれた入力ミスを予期し、そのような名前のプログラムを公のディ レクトリ中にばらまいておく者もいます。気をつけましょう。多くの熟練した UNIX ユーザは、PATH に全く "." を入れなくてもうまくやっています。

setenv PATH /usr/ucb:/bin:/usr/bin
こうすると、カレントディレクトリでプログラムを走らせるために "program" の代わりに "./program" と打ち込む必要があります。しかし安全性の向上は 恐らく手間をかけただけの価値があるでしょう。


UNIX FAQ LIST / Copyright(c)1994,Ted Timar / tmatimar@isgtec.com


Maintainer: あさだ たくや