echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:.
上記の2つのパス変数の違いは何ですか?
これはコマンドのように実行可能ファイルを実行していることがわかりましたが、わかりません。
答え1
パスに追加することは、.
シェルが現在のディレクトリの実行可能ファイルを考慮して実行可能ファイルを使用できなくなることを意味します。./
プレフィックスで入力が必要です。。あなたの場合は最後のものなので、他の一致がない場合にのみそのコマンドが実行されls
ます/bin/ls
。
これには一般的にいくつかの理由があります。いいえ推奨事項(上記のリンクを参照):
.
これはセキュリティに有害である可能性があります。誰かが頻繁にアクセスするディレクトリにバイナリを残して、誤って実行することを望むからです。最初のものではなく最後のものになるのは危険ではありません。- 現在のディレクトリなしでコマンドを実行することは、パスで最初に一致する
./
コマンドが使用されることを意味し、必ずしも現在のディレクトリにあるコマンドである必要はありません。
答え2
背景情報:PATH環境変数は、コロンで区切られたディレクトリのリストです。明示的なパスを指定せずにコマンド名を入力すると(たとえば、「/bin/ls」の代わりに「ls」と入力すると)、シェルはその名前の順序でPATHリストの各ディレクトリとシェルを検索します。見つかった最初の一致プログラムを実行します。
PATH リストのディレクトリの 1 つは、現在のディレクトリ "." とすることができます。 。 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」があり、「ls」と入力すると(もちろん一般的な「/bin/ls」プログラムを実行しようとする)、シェルは代わりに「を実行します。/ls」、他のユーザープログラム。言うまでもなく、この未知のプログラムを実行した結果はあなたを驚かせるかもしれません。
「.」を持つ方が少し良いです。パスの終わりから:
setenv PATH /usr/ucb:/bin:/usr/bin:.
/tmp に "ls" と入力すると、シェルは /usr/ucb、/bin、/usr/bin で "ls" というプログラムを検索し、"." を探し、誤ってユーザーの他のプログラムを実行します。 「ls」プログラムはそれほど危険ではありません。しかし、100%安全ではありません。もしあなたが不器用なタイピストで、ある日 "ls -l"の代わりに "sl -l"を入力すると、 "./sl"(どんな会話でも)を実行する危険があります。いくつかの「巧妙な」プログラマーは一般的なタイプミスを期待し、これらの名前のプログラムをパブリックディレクトリに散布することができます。警戒してください。
経験豊富な多くのUnixユーザーは「。」なくても元気にします。パスから:
setenv PATH /usr/ucb:/bin:/usr/bin
これにより、現在のディレクトリでプログラムを実行するには "program"の代わりに "./program"を入力する必要がありますが、追加されたセキュリティはそれほど価値があります。