여기에 간단한 질문이 있습니다. *
(별표 와일드카드)는 전역 스타일 문자(문자 및 숫자)에만 일치합니까? 아니면 특수 문자와도 일치합니까?
Bash에서는 *
모든 항목과 일치하지만 csh에서는 *
영숫자 문자만 일치합니다.
이에 대해 호환되는 규칙이 있나요? 누구든지 명확히 할 수 있습니까?
답변1
*
모든 문자 시퀀스와 일치하는 파일 이름 패턴입니다.
glob으로 사용될 때(파일 이름 확장/생성에서) *
슬래시 문자(음, 현재 디렉토리의 파일 목록에 대해 패턴이 확인됨) 또는 선행 점과 일치하지 않습니다.
현재 정의는특징시간이 지남에 따라 변화하고 있습니다. 요즘에는 로케일에 따라 정의나 성격이 달라집니다. 오늘날 대부분의 로케일은 텍스트에 UTF-8 인코딩을 사용합니다. 즉, 문자는 가변 길이 바이트 시퀀스입니다. 예를 들어 0x61은 0xc3 0xa9 a
입니다 . é
UTF-8에서는 모든 바이트 시퀀스가 유효한 문자를 구성하는 것은 아닙니다. 예를 들어 0x61 0xc3 0x61은 유효하지 않습니다. 0x61은 변환되지만 a
0xc3은 문자로 변환될 수 없습니다.
대부분의 쉘에서는 *
문자가 아닌 문자도 일치하므로 파일 이름의 바이트가 현재 로케일에서 유효한 문자를 구성하는지 여부에 관계없이 *
이름이 시작하지 않는 현재 디렉토리의 모든 파일이 확장됩니다 . .
한 가지 예외는 적어도 내 데비안 시스템에서 발견된 csh-20110502(자체는 OpenBSD의 csh 기반)인 것 같습니다.
$ touch "$(printf '\xc3')" "$(printf '\xc3\xa9')"
$ ls
? é
$ locale charmap
UTF-8
$ bash -c 'echo *' | sed -n l
\303 \303\251$
$ csh -c 'echo *' | sed -n l
\303\251$
\303
csh
(0xc3 바이트 표현) 은 유효한 문자가 아니기 때문에 출력에서 손실됩니다 .
$ LC_ALL=C csh -c 'echo *' | sed -n l
\303 \303\251$
C 로케일에서는 문자가 바이트에 매핑되므로(0x7f 이상의 값을 가진 문자는 정의되지 않음) 0xc3은 1문자이고 0xc3 0xa9는 2문자입니다.
csh
그럼에도 불구하고 데비안에서 사용할 이유가 없습니다 . tcsh
쉘과 같은 것을 원한다면 그것을 사용하되 csh
완전히 피하는 것이 가장 좋습니다 csh
.
답변2
Open Group 기본 사양 6호 IEEE Std 1003.1 부분에서2.13.2 여러 문자와 일치하는 패턴
별표( '*' )는 빈 문자열을 포함하여 모든 문자열과 일치해야 하는 패턴입니다.
이는 *
모든 문자가 제한 없이 일치됨을 의미합니다.