Korn 쉘의 패턴(변수에 할당)이 다음과 같이 작동하는 이유를 설명할 수 있는 사람이 있습니까?
u@h:w$ pattern='file_[0-9][0-9]'
u@h:w$ ls $pattern
file_01 file_02 file_03
하지만 스마트 모드에서는 작동하지 않습니다 file_{2}([0-9])
.
$ pattern='file_{2}([0-9])'
$ ls $pattern
ls: file_{2}([0-9]): No such file or directory
답변1
이는 POSIX 규정 위반을 방지하기 위한 의도입니다(원래 Bourne 호환성 위반을 방지하기 위한 의도였지만).
echo file_{2}([0-9])
이는 Bourne/POSIX에서는 유효하지 않은 코드이므로 sh
자유롭게 ksh
해석하세요. 하지만:
pattern='file_{2}([0-9])'
echo $pattern
유효한 Bourne/POSIX 코드이며 POSIX에 따르면 이름이 , ...인 파일 sh
과 일치하도록 고안되었습니다 .file_{2}(0)
file_{2}(1)
다음을 사용하더라도 확장의 결과인 경우 스프레드 연산자를 사용할 수 없습니다.
echo @($pattern)
을 사용해야 eval
하거나 다음을 사용할 수 있습니다 FIGNORE
.
FIGNORE="!($pattern)"; echo *
(숨겨진 파일의 확장에 영향을 미치므로 FIGNORE="@(.*|!($pattern))"
glob이 숨겨진 파일을 확장하지 않도록 하려면 이 작업을 수행하십시오).
이러한 확장 연산자 중 일부 는 bash
나중에 zsh
채택되었지만 ( 배타적인 것은 아니지만) POSIX 준수/Bourne 호환성을 다른 방식으로 해결했습니다. 이러한 확장 glob을 모든 컨텍스트에서 사용할 수 있도록 만들었지만 특정 옵션이 활성화된 경우( in , 안에 ). 그러나 이는 이전 버전과의 호환성을 유지하면서 더 많은 연산자를 추가하기가 어렵다는 것을 의미합니다. 예를 들어 지금 연산자를 추가 하면 true를 반환할 것으로 예상하는 스크립트가 중단될 수 있습니다.ksh
{x,y}(...)
kshglob
zsh
extglob
bash
bash
{x,y}(...)
a='{1}(2){3}'; [[ $a = $a ]]