우리의 초점을 다음으로 제한합니다 bash
.이 답변스택 오버플로에서는 다음과 같이 보고됩니다.
extglob
사용되는 플래그입니다파서에 의해. 함수, 복합 명령, &c. 실행 전에 전체적으로 구문 분석됩니다. 따라서extglob
해당 콘텐츠가 구문 분석되기 전에 설정되어야 합니다. 실행 시 설정하지만 구문 분석 시간 이후에는 이전에 구문 분석된 콘텐츠에 아무런 영향을 미치지 않습니다.
shopt -s extglob; ls !(*.txt)
이는 또한 한 줄짜리 명령으로 실행할 수 없지만 (extglob
이전에 설정되지 않은 경우) 두 명령 사이에 줄 바꿈이 있어야 하는 이유이기도 합니다.
그러나 이는 다른 쉘 옵션에는 해당되지 않습니다. 예를 들어 다음을 고려하십시오.
$ ls -a
. .. .hiddenFile file1 file2 file3
$ shopt dotglob
dotglob off
$ echo *
file1 file2 file3
$ shopt -s dotglob; echo *
.hiddenFile file1 file2 file3
파서가 어떤 쉘 옵션을 사용하므로 extglob
이를 사용하는 그룹 명령 내에서 활성화할 수 없는지 어딘가에 문서화되어 있습니까?
에서shopt
bash
설명서 의 페이지위의 동작에 대해서는 아무것도 언급되지 않은 것 같습니다.
답변1
extglob과 같은 파서가 어떤 쉘 옵션을 사용하므로 이를 사용하는 그룹 명령 내에서 활성화할 수 없는 쉘 옵션이 문서화되어 있습니까?
부정적인 것을 증명하기는 어렵지만 포괄적인 목록이 있는지 의심됩니다.
구문 분석에 영향을 미치는 것으로 제가 찾은 것은 다음과 같습니다. 다른 것들도 있을 수 있습니다.
extglob
-- 특수 문자인 괄호의 의미를 변경합니다.expand_aliases
-- 별칭은 처리 초기에 확장됩니다.extquote
-- 일부 인용문의 의미 의미를 변경합니다.interactive_comments
#
-- 단어 시작 부분 의 의미를 변경합니다 .
일부 compat*
옵션도 비슷한 효과를 가질 수 있지만 테스트에 관심이 있는 사람에게 맡기겠습니다.
반면에 , 와 같은 것은 dotglob
glob 의 결과에만 영향을 미치며 구문 분석 방식에는 영향을 미치지 않습니다 failglob
.globstar
와 관련하여 다음 extglob
과 같은 명령줄은 set이 있든 없든 !(foo)
유효합니다 . extglob
이를 사용하면 를 제외한 모든 파일과 일치하는 glob이고 , 이것이 없으면 반환 값이 반전된 foo
명령을 실행하는 하위 쉘입니다 .foo
실제로는 문제가 되지 않습니다. 스크립트에서는 shopt
명령을 자체 라인에 배치할 수 있으므로 구문 분석을 변경하면 문제 없이 다음 라인에 영향을 줍니다. 단일 라이너에서는 -O
명령줄의 옵션을 사용할 수 있습니다. 예를 들어 에서는 bash -O extglob -c 'echo !(foo)'
확장된 glob이 작동합니다.