또 다른 질문에서는 내가 사용하도록 제안되었습니다.
shopt -s extglob
문제를 해결하다. 내 생각에는 이러한 유형의 명령은 주의해서 사용해야 한다는 것입니다. 아마도 다른 스크립트에 바람직하지 않은 영향을 미칠 수 있기 때문일 것입니다. 누구든지 이것에 대해 이야기할 수 있나요?
답변1
shopt
명령을 실행하는 셸의 동작에만 영향을 미칩니다. 이것을 입력하면 ~/.bashrc
비로그인 대화형 쉘과 rsh/ssh를 통해 실행되는 명령에 영향을 미칩니다( 또는 ~/.bashrc
에서 시작된 경우 ~/.profile
로그인 쉘도 영향을 받을 수 있습니다 ~/.bash_profile
).
환경 변수를 로 설정하면 BASHOPTS
해당 extglob
환경 변수가 설정될 때 실행되는 모든 대화형 또는 비대화형 bash 쉘에 영향을 미칩니다( 호출되지 않는 한 sh
).
대화형 셸은 extglob
사용하려는 곳이므로 설정하려는 위치이므로 ~/.bashrc
모든 대화형 셸의 이점을 활용하기 위한 좋은 장소입니다. 스크립트에서 사용하려면 스크립트 시작 부분에 추가하면 됩니다.
문제를 일으킬 수 있는 유일한 장소는 설정될 때이며, 작성하지 않은 일부 코드는 설정될 것으로 예상하지 않습니다. 예를 들어 이것은 귀하의 스크립트일 수 있습니다.원천메시지가 표시되거나 ~/.bashrc
옵션을 설정한 후.
일부 옵션에서는 이것이 사실이지만 그렇지 않습니다. extglob
Bourne 쉘과의 하위 호환성을 유지하기 위해(그리고 구문이 왜 그렇게 어색한지 설명하기 위해) 신중하게 설계되었기 때문입니다(ksh의 David Korn에 의해).
기본적으로 확장 glob을 사용하는 모든 것은 Bourne 쉘 또는 POSIX 쉘 구문에서 구문 오류를 발생시킵니다. Bourne 또는 POSIX 스크립트에 가 있으면 echo @(a)
깨질 수 있습니다(따옴표가 없는 괄호로 인해). 갑자기 오류 메시지 대신 "a"가 출력되기 시작해도 괜찮습니다.
bash에는 zsh와 같은 대체 확장 glob 구문이 없기 때문에 bash가 기본적으로 왜 이를 활성화하지 않는지 잘 모르겠습니다.
편집하다. David Korn은 Bourne/POSIX 호환성을 깨뜨리지 않으려고 열심히 노력하지만 bash는 그렇게 조심하지 않는 것 같습니다. 이것이 아마도 ksh처럼 기본적으로 활성화되지 않은 이유일 것입니다.
ksh(및 ksh 에뮬레이션의 zsh)에서는 인수 또는 명령 대체 시 와일드카드를 수행할 때 확장 와일드카드가 비활성화됩니다.
$ touch a
$ a='@(a)' ksh93 -c 'echo $a'
@(a)
Bash에서는 그렇지 않습니다.
$ a='@(a)' BASHOPTS=extglob bash -c 'echo $a'
a