a[bc]d
이들그리고 그리고 의 차이점은 무엇인가요 a{b,c}d
? a{b,c}d
이미 존재하는데 왜 사람들은 여전히 그것을 사용하는 걸까요 a[bc]d
?
답변1
둘은 완전히 다릅니다.
a[bc]d
는파일 이름 패턴(를 제외한 쉘에서 fish
). 2개로 확장됩니다파일 이름 abd
acd
이것이 현재 디렉토리에 있는 기존 파일의 이름인 경우 .
이
[...]
부분은 나열된 문자 중 단일 문자와 일치하는(또는 범위가 포함될 때 요소를 대조하는) 대괄호 표현식입니다. 패턴을 일치시키려면a[bc]d
문자열 사이a
와 파일 이름 사이의 문자가 또는 이어야d
합니다 .b
c
abd
존재하지만 존재하지 않는 경우acd
에만 확장되며abd
그 반대의 경우도 마찬가지입니다.abd
, 도 존재하지 않는 경우acd
셸 및 옵션에 따라 오류(원래 Unixsh
,(t)csh
,zsh
,fish
,bash -O failglob
)가 발생하고 셸을 종료할 수 있습니다. 모드를 확장되지 않은 채로 두거나(Bourne 및rc
유사한 셸과 유사) 아무것도 확장하지 않을 수 있습니다. (bash/zsh/yash -o nullglob
, 일부 이전 버전fish
, 원래 Unixsh
및(t)csh
동일한 명령에 다른 일치하는 glob이 있는 경우).
a{b,c}d
는버팀대 확장(이를 지원하는 쉘에서). 2개로 확장됩니다끈 abd
그리고 acd
.
부분
{...}
은 쉼표로 구분된 문자열 집합입니다(이 경우 일부 셸에서는 또는 와 같은 범위a..k
또는 또는20..25
과 같은 상위 수준 범위 일 수도 있음 ). 그리고 Each는 측면 문자와 결합되어 다음을 수행합니다. 확장된 문자열 sum 을 계산합니다 . 이러한 문자열은 단일 문자보다 길거나 중괄호로 확장될 수 있습니다.00..20..2
0..20..2%02d
a
d
이러한 문자열이 기존 파일 이름과 일치하는지 여부에 관계없이 확장이 발생합니다.
문자열을 생성하려면 중괄호 확장을 사용하세요. 파일 이름을 일치시키려면 파일 이름 패턴을 사용하십시오.
이 특별한 경우 1은 a[bc]d
기존 파일의 이름일 수 있으므로 rm -f ./*.[ch]
이러한 셸에서 이와 같은 이름을 사용하는 것이 잠재적으로 위험하고 rm -f ./*.{c,h}
문제가 덜합니다.
답변2
a[bc]d
예패턴 매칭이며 POSIX 표준의 일부입니다. POSIX에서는 이를 "패턴 대괄호 표현식"이라고 합니다. 에 기록되어 있어요매뉴얼 섹션 2.13
따옴표가 없고 대괄호 표현식 외부에 있는 경우 다음 세 문자는 패턴 사양에서 특별한 의미를 갖습니다.
?
물음표는 어떤 문자와도 일치하는 패턴입니다.
*별표는 여러 문자와 일치하는 패턴에 설명된 대로 여러 문자와 일치하는 패턴입니다.
[여는 괄호는 패턴 괄호 표현식을 도입해야 합니다.
섹션 2.13.3에서는 파일 이름 확장에 사용될 때 일반적인 정규 표현식에서 예상되는 것과 다르게 동작한다고 언급합니다(강조).
단일 문자와 일치하는 패턴 및 여러 문자와 일치하는 패턴에서 지금까지 설명한 규칙은 파일 이름 확장에 패턴 일치 표기법이 사용될 때 적용되는 다음 규칙에 따라 한정됩니다.
경로 이름의 슬래시 문자는 패턴에 하나 이상의 슬래시를 사용하여 명시적으로 일치해야 하며 별표나 물음표 특수 문자 또는 대괄호 표현식과 일치할 수 없습니다. 패턴의 슬래시는 대괄호 표현식보다 먼저 인식되어야 합니다.따라서 파일 이름 확장을 위한 패턴 대괄호 표현식에는 슬래시를 포함할 수 없습니다. 해당 오른쪽 대괄호가 발견되기 전에 이스케이프 처리되지 않은 왼쪽 대괄호 문자 뒤에 슬래시 문자가 발견되면 왼쪽 대괄호는 일반 문자로 처리됩니다. 예를 들어 패턴은
"a[b/c]d"
또는 같은 경로 이름과 일치하지 않습니다. 리터럴 경로 이름에만 일치합니다.abd
a/d
a[b/c]d
a{b,c}d
예버팀대 확장, 이는 POSIX 사양에 없습니다. bash의 해당 부분은 다음과 같습니다.수동(내 강조점):
중괄호 확장은 임의의 메커니즘입니다.끈발생할 수있다. 이 메커니즘은 다음과 유사합니다.파일 이름 확장자(파일 이름 확장자 참조), 하지만생성된 파일 이름이 존재할 필요는 없습니다.. 중괄호를 확장하는 패턴은 선택적 형식을 취합니다.머리말, 그 뒤에 일련의 쉼표로 구분된 문자열 또는 중괄호 쌍 사이의 시퀀스 표현식이 오고 그 뒤에는 선택적인 문자열이 옵니다. 추신.프리앰블은 중괄호 안에 포함된 각 문자열의 접두사 역할을 하며, 포스트스크립트는 각 결과 문자열에 추가되어 왼쪽에서 오른쪽으로 확장됩니다.
@mosvy의 의견에 따르면 이것은 처음 등장했지만 다른 쉘과 다르게 csh
동작합니다 . 이러한 유형의 버팀대 확장은 에도 존재합니다 .bash
csh
glob(3)
{a..z}
3.0 이후에만 등장한 일종의 버팀대 확장도 있는데 , bash
4.0에서는 더 많은 기능이 추가되었습니다.bash
globbing을 여는 셸의 빈 폴더에서 실행하고 다음 결과를 반환합니다.
$ echo a[bc]d
a[bc]d
$ echo a{b,c}d
abd acd
@Jesse_b의 의견에 따르면 대화형 셸에 있고 둘 다 작동하는 경우 a[bc]d
입력이 덜 번거롭습니다 . 예를 들어 grep pattern [ab][12].txt
.