質問: `* /`がbashまたはzshで何を意味するかについての明確な答えはどこにありますか? _*/_の意味について、unixおよびbashに関するo'reillyからの参照を調べようとしましたが、見つかりませんでした。 _echo */_を実行して、すべてのディレクトリを確認できます。_*_が「すべてのファイルとディレクトリ」を意味するのに対し、それはすべての「ディレクトリ」のみを意味するように見えますが、何らかの理由で、多くのユーザーはそれを知らないようで、本でも言及されていません。_*/_の意味とそのバリエーションについて説明している決定的なソースはありますか?
回答: posix仕様 は、unixツールがどのように動作するかについての最も確実なリファレンスです。 パス名解決に関するセクション は、ファイル名の末尾のスラッシュの意味を説明しています。 少なくとも1つの非<slash>文字を含み、1つ以上の末尾の<slash>文字で終わるパス名は、末尾の<slash>文字の前の最後のパス名コンポーネントが既存のディレクトリまたはディレクトリエントリを指定しない限り、正常に解決されません。これは、パス名が解決された直後にディレクトリ用に作成されます。 つまり、_foo/_は、fooが既存のディレクトリ、またはプログラムが作成するディレクトリである必要があります(したがって、_mkdir foo/_が許可されます)。 fooが他のタイプのファイル(通常のファイル、名前のパイプなど)である場合、_foo/_としてアクセスすることはできません。上記の文は不完全です:_foo/_は実際にはディレクトリへのシンボリックリンクを参照する有効な方法です。これは以下で指定されます: パス名の解決中にシンボリックリンクが検出された場合の動作は、パス名コンポーネントがパス名の末尾にあるかどうか、および実行される機能によって異なります。次のすべてに該当する場合、パス名の解決は完了しています。 1.これは、パス名の最後のパス名コンポーネントです。 2.パス名に末尾がありません。 3.関数はシンボリックリンク自体に作用する必要があります。または、特定の引数は、関数がシンボリックリンク自体に作用するように指示します。 他のすべての場合、システムは残りのパス名があれば、その前にシンボリックリンクの内容(...)を付けます。 つまり、fooがシンボリックリンクであり、プログラムがシンボリックリンクをたどると想定されている場合、_foo/_はリンクのターゲット(ディレクトリである可能性があります)と同等です。したがって、fooがディレクトリへのシンボリックリンクである場合、_foo/_はこのディレクトリを参照する有効な方法です。ただし、fooが通常のファイルまたは他の非ディレクトリのシンボルである場合、_foo/_はそのファイルを参照する有効な方法ではありません。 open などの関数は、既存の非ディレクトリである末尾にスラッシュを含むパス名を指定すると、エラーenotdirを返します。 [enotdir] (...)_o_creat_と_o_excl_は指定されていません。パス引数には、少なくとも1つの非<slash>文字が含まれ、1つ以上の末尾の<slash>文字で終わり、最後のパス名コンポーネントは、ディレクトリでもディレクトリへのシンボリックリンクでもない既存のファイルを指定します(...) _*/_のスラッシュの影響については、暗黙的に sh のパターンマッチングに関するセクションを参照してください。パターン内の_/_には特別な規則はありません(ブラケット式に表示できないという規則はここでは関係ありません)。したがって、パターン内の_/_は、パス名内の_/_と一致する必要があります。たとえば、パターン_*/_は_foo/_に一致しますが、fooには一致しません。したがって、_*/_は、ディレクトリおよびディレクトリへのシンボリックリンクに一致しますが、通常のファイル、通常のファイルへのシンボリックリンク、壊れたシンボリックリンク、名前付きパイプなどには一致しません。