シェルはいつPATHを検索しますか?

シェルはいつPATHを検索しますか?

PATHいつ検索すべきか少し混乱しますね。私はPATH、単純なファイル名が次のように行の最初のトークンとして提供されている場合にのみ検索されると思いました。

$ date

しかし、私が作業している問題の1つは、PATH./プレフィックスを持つファイルを非常に明示的に一覧表示したときにそのファイルも検索されることを示しているようです。

$ ./date

これは本当に本当ですか?つまり、私の作業ディレクトリに実行可能ファイル名前付きdatedate単純なスクリプトであると仮定)この質問に対する答えは、シェルが検索を続行することを示しているようですPATH(その後、dateいくつかのディレクトリで標準ユーティリティを探します(例bin:)。

ちょっと似た質問をしました。ここそこへの答えは、シェルが検索する順序の良いアイデアを提供します。しかし、コマンドを単純なファイル名で提供することを強調します。ここでは、./プレフィックスを非常に明示的に指定しました。シェルがまだ検索されているのはなぜですかPATH?それとも何か抜けましたか?


ソベルからLinux実用ガイド:

次の予期しない結果を説明します。

$ whereis date
date: /bin/date ...
$ echo $PATH 
.:/usr/local/bin:/usr/bin:/bin
$ cat > date
echo "This is my own version of date." 
$ ./date
Sun May 21 11:45:49 PDT 2017

1つはシェルスクリプトが./date実行され、出力は次のように「予想」されます。"This is my own version of date."

ベストアンサー1

PATH入力にスラッシュが含まれている場合、POSIX互換の動作は変数を使用しないことです。たとえば、コマンドがあれば検索しますがfoo、 or または : の場合、1 つ以上のスラッシュがある項目は検索しません。PATHfoo/bar/foo/bar./foo/bar

シェルがPATHそのような機能に依存せず、独自のコードベース内で検索動作を複製する必要がある場合は、入力にスラッシュが含まれている場合はexecvp検索を避ける必要があります。

しかし、結果を簡単に再現できます。

私の端末から実際にコピーして貼り付ける:

$ cat > date
echo "this is my own version of date."
$ ./date
Mon 12 Feb 2024 06:38:20 PM PST
$

私がやっていることは、その行のCtrl-Decho ...に入力することではありません。したがって、$ ./date標準入力に入力されるすべてのテキストになりますMon 12 ...cat

おすすめ記事