쇼핑의 위험성

쇼핑의 위험성

또 다른 질문에서는 내가 사용하도록 제안되었습니다.

shopt -s extglob

문제를 해결하다. 내 생각에는 이러한 유형의 명령은 주의해서 사용해야 한다는 것입니다. 아마도 다른 스크립트에 바람직하지 않은 영향을 미칠 수 있기 때문일 것입니다. 누구든지 이것에 대해 이야기할 수 있나요?

답변1

shopt명령을 실행하는 셸의 동작에만 영향을 미칩니다. 이것을 입력하면 ~/.bashrc비로그인 대화형 쉘과 rsh/ssh를 통해 실행되는 명령에 영향을 미칩니다( 또는 ~/.bashrc에서 시작된 경우 ~/.profile로그인 쉘도 영향을 받을 수 있습니다 ~/.bash_profile).

환경 변수를 로 설정하면 BASHOPTS해당 extglob환경 변수가 설정될 때 실행되는 모든 대화형 또는 비대화형 bash 쉘에 영향을 미칩니다( 호출되지 않는 한 sh).

대화형 셸은 extglob사용하려는 곳이므로 설정하려는 위치이므로 ~/.bashrc모든 대화형 셸의 이점을 활용하기 위한 좋은 장소입니다. 스크립트에서 사용하려면 스크립트 시작 부분에 추가하면 됩니다.

문제를 일으킬 수 있는 유일한 장소는 설정될 때이며, 작성하지 않은 일부 코드는 설정될 것으로 예상하지 않습니다. 예를 들어 이것은 귀하의 스크립트일 수 있습니다.원천메시지가 표시되거나 ~/.bashrc옵션을 설정한 후.

일부 옵션에서는 이것이 사실이지만 그렇지 않습니다. extglobBourne 쉘과의 하위 호환성을 유지하기 위해(그리고 구문이 왜 그렇게 어색한지 설명하기 위해) 신중하게 설계되었기 때문입니다(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

관련 정보