POSIXシェル標準はこのサイトで述べています
http://pubs.opengroup.org/onlinepubs/9699919799/
シェルPATH
が実行可能ファイルを探すためにどのように使用するかについて:
「リストは最初から最後まで検索され、指定された名前と適切な実行権限を持つ実行可能ファイルが見つかるまで、各プレフィックスにファイル名が適用されます。」
まあ、これはこれが実際のPOSIX実装で動作するように見える方法ではありません:
man which
言う:
「現在の環境で実行されるファイル(またはリンク)のパス名を返します。引数が厳密にPOSIX準拠のシェルでコマンドとして指定されている場合、これは、PATHを検索して、引数。シンボリックリンクには従いません。」
OK、この状況を見てみましょう:
$ pwd
/home/mark
$ echo $PATH
/home/mark/bin:
...
$ ls -l bin/foobar
lrwxrwxrwx 1 mark mark 18 Dec 12 22:51 bin/foobar -> /home/mark/foobar1
$ touch foobar1
$ which foobar
$ chmod a+x foobar1
$ which foobar
/home/mark/bin/foobar
OK、PATH
正しい名前のシンボリックリンクがここにあり、ls
実行可能であると報告されています。
which
それはまったく見ていませんが、それが指しているものにのみ興味があります。
両方があるという事実にもかかわらず、それman which
を明示的にはシンボリックリンクをたどりません(実際、我々はので、それは、ない見ることを言ってwhich foobar
印刷されないfoobar1
)、また、POSIXシェルのドキュメントは、上記引用されていること、決してで次のシンボリックリンクを言及PATH
するアルゴリズム。
では、which
既存のシェルは間違っていますか、それともドキュメントが理解できていませんか?
明確にするために:
私は知っており、既存の行動を説明できます。私の質問は「これはどのように機能するのですか?」ではありません。私が知っています。
私の質問はドキュメンテーションについてです。引用したドキュメンテーションをフォローする際の私の間違いはどこにありますか。または、ドキュメントが間違っていますか?
動機:なぜ気にするのか?
まあ、私は実装者です。実装者が異なれば、要件も異なります。私にとっての要件は、現在のPOSIX標準の言葉を正確に遵守する必要があることです(正確には、標準自体が多少バグがあるため、より正確に言えば、可能な限り最高です)。神の言葉のように。
現在、標準的な表現はかなり明確です-以下のシンボリックリンクについては言及されていませんが、他の多くの場所では、それを行う必要がある場所について言及されています。したがって、この場合はしないでください。
ただし、念のため念のため、方法dash
とbash
動作を常に確認します。もちろん、dash
POSIXとして請求されていますが、POSIXに準拠した小さなバグがたくさんありますが、ここでも少し問題があります。 bash
、私はまだPOSIXのバグを見つけていませんが、bashは実際にはPOSIXではありません。それだけではありません。
だからあなたはそれを持っています。それが私が気にする理由です。
$PATH
、シンボリックリンクはありません。
lstat(2)
)、それらに従うことは通常述べられていません。たとえば、の説明ではopen(2)
、の動作について説明するときにシンボリックリンクについてのみ言及していますO_CREAT | O_EXCL
。ターゲットファイルが開かれることを示す必要はありません。
$PATH
シンボリックリンクを含めることができます。お試しくださいwhich sh
。