BashまたはZshの「*/」の意味に対する明確な答えをどこで見つけることができますか?

BashまたはZshの「*/」の意味に対する明確な答えをどこで見つけることができますか?

私はそれが何を意味するのかを知るために、UnixとBashに関するO'Reillyの参考文献を見ましたが、*/何も見つかりませんでした。echo */すべてのディレクトリを表示できます。

これは単に「すべてのディレクトリ」を意味するように見えますが、*むしろ「すべてのファイルとディレクトリ」を意味するように見えますが、何らかの理由で多くのユーザーがこれについて知らないようで、本ではこれについて言及しません。

*/その意味と変形について話す明確な情報源はありますか?

ベストアンサー1

これPOSIX仕様UNIX ツールがどのように機能するかについての権威ある参考資料です。これパス名解決情報ファイル名の後に続くスラッシュの意味を説明してください。

1 つ以上の <slash> 以外の文字を含み、1 つ以上の末尾 <slash> 文字で終わるパス名は、末尾の <slash> 文字の前の最後のパス名コンポーネントが既存のディレクトリまたはディレクトリエントリを指定しない限り、正常に解析してはいけません。パス名を解析すると、すぐにディレクトリ用に作成されます。

つまり、既存のディレクトリであるか、プログラムが作成するディレクトリ(したがって許可されるディレクトリ)である必要がfoo/あります。他の種類のファイル(通常のファイル、パイプ名など)の場合、そのファイルにアクセスできません。foomkdir foo/foofoo/

上記の文は不完全です。foo/実際には、ディレクトリシンボリックリンクを参照する有効な方法です。詳細は次のとおりです。

パス名解決中にシンボリックリンクが見つかると、パス名コンポーネントがパス名の末尾にあるかどうか、および実行している機能によって動作が異なります。次の条件がすべて真の場合、パス名の解決は完了です。

1. これは、パス名の最後のパス名コンポーネントです。 2. パス名が後ろにありません。 3.関数がシンボリックリンク自体で機能する必要があるか、一部のパラメータは関数がシンボリックリンク自体で機能することを示します。

他のすべてのケースでは、システムは残りのパス名(存在する場合)の前にシンボリックリンク(...)の内容を付ける必要があります。

つまり、fooシンボリックリンクであり、プログラムがシンボリックリンクに従う必要がある場合、foo/これはリンクの宛先と同じです(ディレクトリである可能性があります)。したがって、fooディレクトリへのシンボリックリンクの場合は、foo/そのディレクトリを参照する有効な方法です。ただし、foo通常のファイル、またはディレクトリ以外の記号の場合、これはfoo/ファイルを参照する有効な方法ではありません。

次の機能openENOTDIR指定されたパス名にスラッシュがあり、既存のディレクトリではない場合はエラーが返されます。

[ ENOTDIR]
(…)O_CREATO_EXCL指定しない場合、パス引数には <slash> 以外の文字が 1 つ以上含まれ、1 つ以上の末尾の <slash> 文字で終わり、最後のパス名コンポーネントはディレクトリでもディレクトリもない既存のファイルディレクトリの名前を指定します。ディレクトリシンボリックリンク(...)

スラッシュの効果は、*/以下に暗示的に説明される。パターンマッチングについてsh。 inパターンには特別な規則はありません/(括弧内に表示できないという規則はここでは関係ありません)。したがって、/パターンのaは/パス名のaと一致する必要があります。たとえば、パターンは*/一致しますfoo/が一致しませんfoo。したがって、*/ディレクトリとディレクトリへのシンボリックリンクは一致しますが、通常のファイル、一般ファイルへのシンボリックリンク、壊れたシンボリックリンク、名前付きパイプなどは一致しません。

おすすめ記事