파서는 어떤 bash 쉘 옵션을 사용합니까?

파서는 어떤 bash 쉘 옵션을 사용합니까?

우리의 관심을 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이를 사용하는 그룹 명령에서 활성화할 수 없는지 어딘가에 문서화되어 있습니까?

내부에shoptbash매뉴얼 페이지위의 행위에 대해서는 언급이 없는 것 같습니다.

답변1

extglob과 같은 파서가 어떤 셸 옵션을 사용하여 이를 사용하는 그룹 명령에서 활성화할 수 없는지 어딘가에 문서화되어 있습니까?

부정적인 것을 증명하기는 어렵지만 포괄적인 목록이 있는지 의심됩니다.

구문 분석에 영향을 미치는 것으로 내가 찾은 것은 다음과 같으며 다른 것들도 있을 수 있습니다.

  • extglob-- 대괄호의 의미를 변경합니다. 그렇지 않으면 특수 문자입니다.
  • expand_aliases-- 별칭은 처리 초기에 확장됩니다.
  • extquote-- 일부 인용문의 의미를 변경했습니다.
  • interactive_comments#--단어 시작의 의미를 변경합니다.

일부 compat*옵션은 비슷한 효과를 가질 수 있지만 테스트는 더 관심 있는 사람들에게 맡기겠습니다.

반면에 , dotglob와 같은 failglob것들은 globstarglob의 결과에만 영향을 미치며 구문 분석 방식에는 영향을 미치지 않습니다.

와 관련하여 extglob이와 같은 명령줄은 set 유무에 관계없이 유효합니다 !(foo). extglob이를 사용하면 모든 파일과 일치하는 glob이지만 foo, 이것이 없으면 명령을 실행 foo하고 반대 값을 반환하는 하위 쉘입니다.


실제로는 문제가 되지 않습니다. 스크립트에서는 shopt명령을 자체 라인에 배치할 수 있으므로 구문 분석의 변경 사항이 문제 없이 다음 라인에 영향을 줍니다. 한 줄의 코드에서 -O명령줄의 옵션을 사용할 수 있습니다. 예를 들어 bash -O extglob -c 'echo !(foo)'확장된 glob이 작동합니다.

관련 정보