シェルはいつ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

答え2

質問に記載されている練習を見ると、cat標準外の作業を実行するように定義された関数やスクリプトもcat機能できると思います。私は本のオンラインコピーを見つけましたが、この練習は2版、3版、4版にあり、出力のタイムスタンプが変更されたので誤字ではないと思います。

echo "This is my own version of date."3番目のコマンドが入力か出力かによって、次のようにcatなります。

cat () {
  read; # Reads a line of input, but we won't do anything with it
  echo date; # Write to stdout
  chmod +x /proc/self/fd/1; # Apply execute permissions to stdout's backing file
}

または:

cat () {
  echo 'echo "This is my own version of date."' >&2 ; # Write to stderr
  echo date; 
  chmod +x /proc/self/fd/1;
}

その理由は次のとおりです。

  • /proc/self/fd/1stdoutがファイルにリダイレクトされる場合、これは物理ファイルへのシンボリックリンクです。
  • chmod引数としてシンボリックリンクが与えられると、指すファイルに対する権限を変更します。

Red Hat 4.2(1997年にリリース)マンページを確認しましたが、proc(5)chmod(1))、この機能はこの本の最初のバージョンに戻っても機能し続けます。 (もちろん偽物catも直接探すことができます。)chmod +x ./date

関連情報