우리의 관심을 bash
,이 답변Stack Overflow에 대해 다음과 같은 보고서가 있습니다.
extglob
사용되는 표시입니다파서로. 함수, 복합 명령 등 실행 전에 완전히 구문 분석되었습니다. 따라서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
와 같은 failglob
것들은 globstar
glob의 결과에만 영향을 미치며 구문 분석 방식에는 영향을 미치지 않습니다.
와 관련하여 extglob
이와 같은 명령줄은 set 유무에 관계없이 유효합니다 !(foo)
. extglob
이를 사용하면 모든 파일과 일치하는 glob이지만 foo
, 이것이 없으면 명령을 실행 foo
하고 반대 값을 반환하는 하위 쉘입니다.
실제로는 문제가 되지 않습니다. 스크립트에서는 shopt
명령을 자체 라인에 배치할 수 있으므로 구문 분석의 변경 사항이 문제 없이 다음 라인에 영향을 줍니다. 한 줄의 코드에서 -O
명령줄의 옵션을 사용할 수 있습니다. 예를 들어 bash -O extglob -c 'echo !(foo)'
확장된 glob이 작동합니다.