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。したがって、*/ディレクトリとディレクトリへのシンボリックリンクは一致しますが、通常のファイル、一般ファイルへのシンボリックリンク、壊れたシンボリックリンク、名前付きパイプなどは一致しません。

答え2

いくつかあります。ヒントディレクトリとのみ一致する必要があるのは*/bashマニュアルです(強調表示):

  1. *
    空の文字列を含むすべての文字列と一致します。 globstarシェルオプションが有効で*がパス名拡張コンテキストで使用される場合、単一パターンとして使用される2つの隣接する*は、すべてのファイルとゼロ個以上のディレクトリとサブディレクトリと一致します。 後ろに/が来たら 隣接する2つ*ディレクトリとサブディレクトリのみが一致します。

    aはディレクトリとサブディレクトリにのみ一致することは明らかであり、**/これはa*/も一致しなければならないことを意味するようです。

  2. globstar
    が設定されている場合、パス名拡張コンテキスト**で使用されるパターンは、すべてのファイルとゼロ以上のディレクトリとサブディレクトリと一致します。 パターンの後に/が続くと、ディレクトリとサブディレクトリのみが一致します。

    上記のヒントを繰り返します。

zshマニュアルから:

  1. -g globstringは
    ファイル名ワイルドカードを使用してglobstringを拡張します。すぐに拡張しないように引用する必要があります。結果のファイル名は可能な補完と見なされます。使用`*(/)' `*/'ディレクトリの代わりに

    これは、aが*/ディレクトリを表す必要があることを明らかに示しています。他の場所では

しかし、唯一の実際の確認はkshのマニュアルから来ます。

*
空の文字列を含むすべての文字列と一致します。ファイル名拡張で使用するときにglobstarオプションを有効にすると、2つの隣接する*自体がすべてのファイルとゼロ以上のディレクトリとサブディレクトリと一致します。もし 後に/が続くと、ディレクトリとサブディレクトリのみが一致します。

これはシングルトンが何を*すべきかを明確に説明します。

POSIXが主にkshの仕組みに基づいていて、bashとzshがkshの仕組みをエミュレートしようとしていることを考えると、3つのマニュアルすべてが同じ機能を繰り返すと予想するのが合理的です。

答え3

以下にいくつかの説明があります。bashマニュアル、パターンマッチング

3.5.8.1 パターンマッチング

以下に説明する特殊パターン文字を除いて、パターンに表示されるすべての文字はそれ自体が一致します。 NUL 文字はパターンには現れません。バックスラッシュは次の文字をエスケープします。エスケープされたバックスラッシュは一致時に削除されます。特殊パターン文字を文字通り一致させるには、引用符で囲む必要があります。

特殊パターン文字の意味は次のとおりです。

*

空の文字列を含むすべての文字列と一致します。 globstar シェルオプションが有効で「*」が使用されている場合ファイル名拡張子のコンテキスト、単一パターンとして使用される2つの隣接する「*」は、すべてのファイルとゼロ個以上のディレクトリとサブディレクトリと一致します。後ろに「/」が続く場合、2つの隣接する「*」はディレクトリとサブディレクトリにのみ一致します。

そしてLinux文書化プロジェクト以下に説明がありますecho *

吹くファイル名拡張の実行引用符のないコマンドラインパラメータに関するものです。 echoコマンドはこれを示しています。

bash$ echo * a.1 b.1 c.1 t2.sh test1.txt`

bash$ echo t* t2.sh test1.txt

bash$ echo t?.sh t2.sh```

答え4

拡張は*/シェルに特別な意味を持ちません。拡張とまったく同じように、*.txtすべての項目が一覧表示されます。既存のパス名で終了します.txt

~のためどのシェルでは、aは*/で始まるすべての文字に展開されます/

唯一の問題は、aがpathnameaで終わることができるときを理解することです/

最後のファイル名が存在し、ディレクトリの場合にのみ可能です。

明示的な確認(man kshから):

*
...の後に/が続く場合は、ディレクトリとサブディレクトリのみが一致します。

関連情報