PATH
いつ検索すべきか少し混乱しますね。私はPATH
、単純なファイル名が次のように行の最初のトークンとして提供されている場合にのみ検索されると思いました。
$ date
しかし、私が作業している問題の1つは、PATH
./プレフィックスを持つファイルを非常に明示的に一覧表示したときにそのファイルも検索されることを示しているようです。
$ ./date
これは本当に本当ですか?つまり、私の作業ディレクトリに実行可能ファイル名前付きdate
(date
単純なスクリプトであると仮定)この質問に対する答えは、シェルが検索を続行することを示しているようです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 つ以上のスラッシュがある項目は検索しません。PATH
foo/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-D後echo ...
に入力することではありません。したがって、$ ./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/1
stdoutがファイルにリダイレクトされる場合、これは物理ファイルへのシンボリックリンクです。chmod
引数としてシンボリックリンクが与えられると、指すファイルに対する権限を変更します。
Red Hat 4.2(1997年にリリース)マンページを確認しましたが、proc(5)
、chmod(1)
)、この機能はこの本の最初のバージョンに戻っても機能し続けます。 (もちろん偽物cat
も直接探すことができます。)chmod +x ./date