변수의 KSH 모드가 작동하지 않습니다.

변수의 KSH 모드가 작동하지 않습니다.

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}(...)kshglobzshextglobbashbash{x,y}(...)a='{1}(2){3}'; [[ $a = $a ]]

관련 정보