`。[]。foo []`はbashで何をしますか?なぜ「..」と一致するのですか?


16

次を見てください:

$ echo .[].aliases[]
..
$ echo .[].foo[]
..
$ echo .[].[]
..
$ echo .[].xyz[]
..
$ echo .xyz[].xyz[]
.xyz[].xyz[]
$ echo .xyz[].[]
.xyz[].[]

どうやらこれは何かをつかんでいるように見えますが、結果がどのように組み合わされるかはわかりません。私の理解で[]は、空の文字クラスです。もし直観的だとしたら

  • 空の文字列のみに一致しました。この場合、bashはこのディレクトリ内で一致するものは何もないので、bashが完全に再現されることを期待しますが、..aliases(最初の例では)
  • またはまったくない; この場合、bashが文字列全体を再現することも期待しています。

これは、GNU bashバージョン4.4.23(1)-releaseを使用しています。

回答:


25

[セットを開始します。セットはで終了し]ます。ただし]、セットの一部として使用する方法があり、それを]最初の文字として指定することです。空のセットは意味をなさないため、これはあいまいではありません。

したがって、例は基本的にすべてドットの後にドットを含むセットが続くため、2つのドットに一致します。

後の例ではファイルが見つからないため、そのまま返されます。


4

引用符で囲まれた文字列のみがグロビングの対象ではありません

$ echo ".[].aliases[]"
.[].aliases[]

ただし、引用符で囲まれていない文字列はグロビングの対象となります。含まれている引用符で囲まれていない文字列*または?または(有効)[](ブラケット表現は)それと一致するファイルのリストによって変更されます。a *が一致するディレクトリ内のすべてのファイルに変換され、?1文字のみのファイルと一致するのと同じ方法で、(有効な)[]は括弧内の文字を含むファイルと一致します。ドットは有効な文字です:

$ echo a[.]b
a[.]b

$ touch "a.b"
$ echo a[.]b
a.b

を一致させる]には、かっこ内の最初の文字にする必要があります。

$ touch "a]b"
$ ls a[]]b
a]b

空のブラケット式は意味がありません(展開されません)。

$ touch ab
$ ls a[]b
ls: cannot access 'a[]b': No such file or directory

これがこれが機能する理由です:

$ touch a]c abc afc azc a:c a?c aoc 
$ ls a[]bfz:?]c
abc  a:c  a?c  a]c  afc  azc

以下のため[のアイデアと似ています。

$ touch a[c
$ ls a[[]c
a[c

ただし、ブラケット式の任意の位置に配置できます。

$ ls a[]bf[z:?]c
abc  a:c  a?c  a[c  a]c  afc  azc

$ ls a[]bfz:?[]c
abc  a:c  a?c  a[c  a]c  afc  azc

投稿した文字列は.[].foo[]、ドットに続いてa ]、a .、a f、a oまたはaのいずれかに一致します[。次のようなものです。

$ echo a[].foo[]c
a[c a]c afc aoc

そして、次のように一致します。

$ touch .] .f .o .[ .a .b .z

$ echo .[].foo[]
.. .[ .] .f .o

..デフォルトですべてのディレクトリ内に存在するため、ディレクトリエントリを作成する必要はありません。ただし、単純なドット.は(実際にはドットを使用して)明示的に一致させる必要があるため、グロブとは一致しません。

しかし..aliases、ブラケット式は1文字のみに一致するため、これは一致しません。複数の文字を一致させるには、*(何でも)を使用する必要があります:

$ touch ..a ..l ..i ..aliases ..alias ..ali
$ echo .[].aliases[]
.. .[ .] .a

$ echo .[].aliases[]*
.. .[ .] .a ..a ..ali ..alias ..aliases ..i ..l
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.