아래를 봐주세요:
$ echo .[].aliases[]
..
$ echo .[].foo[]
..
$ echo .[].[]
..
$ echo .[].xyz[]
..
$ echo .xyz[].xyz[]
.xyz[].xyz[]
$ echo .xyz[].[]
.xyz[].[]
분명히 이것은 뭔가를 전달하는 것 같지만 결과가 어떻게 조화를 이루는지 이해하지 못합니다. 내 이해에 따르면 []
이것은 빈 문자 클래스입니다. 직관적으로 보면
- 이는 빈 문자열에만 일치합니다. 이 경우에는 해당 디렉터리에 일치하는 항목이 없기 때문에 bash가 전체 문자열을 재현할 수 있기를 바랍니다. 또한
..aliases
(첫 번째 예에서) 다음과 같습니다. - 아니면 아무것도 아닙니다. 이 경우 bash가 문자열도 정확하게 재현할 수 있기를 바랍니다.
이는 GNU bash 버전 4.4.23(1) 릴리스 버전입니다.
답변1
[
그룹을 시작하세요 . 그룹이 에 의해 종료되었습니다 ]
. 그러나 ]
이를 세트의 일부로 만드는 방법이 있습니다 . 즉, ]
첫 번째 문자로 지정하는 것입니다. 빈 집합은 아무 의미도 없으므로 이는 모호하지 않습니다.
따라서 귀하의 예는 기본적으로 점과 그 점을 포함하는 집합이 뒤따르는 것이므로 두 점과 일치합니다.
나중 예제에서는 파일을 찾지 못하므로 그대로 반환합니다.
답변2
오직선두문자열은아니요와일드카드의 영향을 받는 항목:
$ echo ".[].aliases[]"
.[].aliases[]
그러나 인용되지 않은 문자열은 와일드카드를 사용하기 쉽습니다. *
또는 (유효)(대괄호 표현식)을 포함하는 ?
따옴표가 없는 문자열은 []
일치하는 파일 목록에 따라 수정됩니다. a *
가 디렉터리의 모든 파일과 일치하고 a가 ?
문자가 하나만 포함된 파일과 일치하는 것처럼 a (유효)는 []
대괄호 안에 문자가 포함된 파일과 일치합니다. 점은 유효한 문자입니다.
$ echo a[.]b
a[.]b
$ touch "a.b"
$ echo a[.]b
a.b
a와 일치하려면 ]
괄호 안의 첫 번째 문자여야 합니다.
$ 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
그러나 대괄호 표현식은 일치만 하기 때문에 이는 일치하지 않습니다 .하나특징. 여러 문자를 일치시키려면 *
다음을 사용해야 합니다 .
$ touch ..a ..l ..i ..aliases ..alias ..ali
$ echo .[].aliases[]
.. .[ .] .a
$ echo .[].aliases[]*
.. .[ .] .a ..a ..ali ..alias ..aliases ..i ..l