`. []. foo []`는 bash에서 무엇을합니까? 왜`..`와 일치합니까? 보이지만 결과가 어떻게 구성되는지

다음을보십시오 :

$ 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)-릴리스입니다.



답변

[세트를 시작합니다. 세트는로 종료됩니다 ]. 그러나 ]세트의 일부로 가질 수있는 방법이 있으며 ]첫 번째 문자로 를 지정하는 것입니다. 빈 세트는 의미가 없으므로 모호하지 않습니다.

따라서 예제는 기본적으로 모든 점 다음에 점이 포함 된 집합이므로 두 점과 일치합니다.

후자의 예제는 파일을 찾지 못하므로 그대로 반환됩니다.


답변

인용 된 문자열 만 globbing 대상 이 아닙니다 .

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

그러나 인용되지 않은 줄은 움켜 subject니다. 포함하는 인용되지 않은 문자열 *이나 ?또는 (유효) [](브라켓 발현)이 일치하는 파일의 목록이 수정됩니다. a *가 일치하는 디렉토리의 모든 파일로 변환되고 a ?가 한 문자의 파일 과 일치 하는 것과 같은 방식으로 (유효한) []파일은 대괄호 안의 문자와 일치합니다. 점은 유효한 문자입니다.

$ 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

디렉토리 항목 ..은 기본적으로 모든 디렉토리 내에 존재하므로 작성하지 않아도됩니다. 그러나 간단한 점 .은 명시 적으로 일치해야하므로 실제로 점을 사용하여 glob과 일치하지 않습니다.

그러나 ..aliases대괄호 표현식은 문자 만 일치하므로 일치하지 않습니다 . 여러 문자를 일치 시키려면 *(무엇이든) 을 사용해야합니다 .

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

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