차이점은 무엇이며 a[bc]d
그리고 a{b,c}d
? 사람들 a{b,c}d
이 이미있을 때 왜 사용 a[bc]d
합니까?
답변
둘은 상당히 다릅니다.
a[bc]d
A는 파일 이름 패턴 (이외의 껍질에이 fish
). 그것은 두 가지로 확대 될 파일 이름 abd
및 acd
그 경우 현재 디렉토리에 존재하는 파일의 이름입니다.
-
[...]
부분은 상장 (또는 범위가 포함될 때 요소를 조합) 사람에서 단일 문자와 일치하는 괄호 표현이다. 패턴과 일치 시키려면a[bc]d
문자열a
과d
파일 이름 사이의 문자는 ab
또는 a 여야합니다c
. -
경우는
abd
존재하지만acd
, 그것은 단지로 확장 할하지 않는abd
반대, 그리고 그. -
둘 경우
abd
,도acd
존재 쉘 및 옵션에 따라, 그것은 오류를 트리거하지 않습니다 (원래 유닉스 것sh
,(t)csh
,zsh
,fish
,bash -O failglob
) 가능성이 쉘을 종료하거나 (Bourne의 같은과 패턴 unexpanded¹을 남겨rc
-like 껍질) 이상으로 확장 아무것도 (bash/zsh/yash -o nullglob
, 일부 이전 버전의fish
원래 Unixsh
및(t)csh
동일한 명령에 다른 일치하는 glob가있는 경우).
a{b,c}d
A는 중괄호 확장 (이들을 지원 포탄은). 그것은 두 가지로 확대 될 문자열 abd
및 acd
.
-
{...}
(일부 쉘에, 또한 등의 범위 일 수있다 본 실시 예에서 부분 문자열 쉼표로 구분 세트이다a..k
또는20..25
추천 이상의 고급 것들00..20..2
또는0..20..2%02d
)와 팽창 측부 이러한 스트링의 각각의 조합에 의해 계산된다 문자열a
과d
. 이 문자열은 단일 문자보다 길 수 있으며 확장 확장 자체 일 수도 있습니다. -
확장은 이러한 문자열이 기존 파일 이름에 해당하는지 여부에 관계없이 발생합니다.
문자열을 구성하는 경우 중괄호 확장을 사용하십시오. 파일 이름이 일치하는 경우 파일 이름 패턴을 사용하십시오.
¹이 특별한 경우에 a[bc]d
기존 파일의 이름이 될 수 있습니다. 이런 rm -f ./*.[ch]
쉘에서 사용하는 것이 위험 rm -f ./*.{c,h}
하고 문제가 적은 이유 입니다.
답변
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)
있습니다.
3.0 {a..z}
후에 만 나타나는 다른 유형의 중괄호 확장 이 bash
있으며 bash
4.0에 더 추가됩니다 .
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
.