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

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

우리의 초점을 다음으로 제한합니다 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이를 사용하는 그룹 명령 내에서 활성화할 수 없는지 어딘가에 문서화되어 있습니까?

에서shoptbash설명서 의 페이지위의 동작에 대해서는 아무것도 언급되지 않은 것 같습니다.

답변1

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

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

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

  • extglob-- 특수 문자인 괄호의 의미를 변경합니다.
  • expand_aliases-- 별칭은 처리 초기에 확장됩니다.
  • extquote-- 일부 인용문의 의미 의미를 변경합니다.
  • interactive_comments#-- 단어 시작 부분 의 의미를 변경합니다 .

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

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

와 관련하여 다음 extglob과 같은 명령줄은 set이 있든 없든 !(foo)유효합니다 . extglob이를 사용하면 를 제외한 모든 파일과 일치하는 glob이고 , 이것이 없으면 반환 값이 반전된 foo명령을 실행하는 하위 쉘입니다 .foo


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

관련 정보