"bash -c"에 전달된 명령에서 대괄호로 묶인 확장된 glob을 어떻게 사용할 수 있습니까?

"bash -c"에 전달된 명령에서 대괄호로 묶인 확장된 glob을 어떻게 사용할 수 있습니까?

확장된 glob을 사용하려고 하는데 bash -c작동하게 하는 방법을 찾지 못했습니다.

내가 시도한 것들

  1. bash -c 'for f in *.!(ext); do echo $f; done'

    결과:

    bash: -c: line 0: syntax error near unexpected token `('
    

     

  2. bash -c 'for f in *.!\(ext\); do echo $f; done'

    결과:

    *.!(ext)
    

     

  3. bash -c 'for f in *.!$0; do echo $f; done' '(ext)'

    결과:

    *.!(ext)
    

     

  4. bash -c 'for f in "*.!(ext)"; do echo $f; done'

    결과:

    *.!(ext)
    

답변1

에서 확장된 글로빙 모드를 사용하려면 어떤 방식으로든 셸 옵션을 활성화 bash해야 합니다 .extglob

인라인 스크립트에 대해 이 작업을 수행하는 가장 쉬운 방법은 bash -c명령줄에서 옵션을 사용하여 셸 옵션을 설정하는 것입니다.-O

bash -O extglob -c 'script code here'

직접 전화하셔도 됩니다shopt -s extglob 스크립트 내에서, 그러나 쉘이 코드를 구문 분석하는 방식을 변경하므로(쉘의 구문을 수정함) 이 작업이 별도의 줄에서 수행되는지 확인해야 합니다.

bash -c 'shopt -s extglob
         script code here'

문자열로 끝나지 않는 모든 이름을 인쇄하는 실제 작업은 다음과 같습니다 .ext.

bash -O extglob -O dotglob -O nullglob -c 'printf "%s\n" !(*.ext)'

추가 설정 dotglobnullglob옵션을 사용하면 스크립트는 숨겨진 이름을 일치시키고 일치하는 항목이 없으면 (확장되지 않은 패턴을 인쇄하는 대신) 빈 줄을 인쇄합니다.

패턴은 (not just)로 *.!(ext)끝나는 파일 이름을 제외합니다.ext.ext그리고점이 포함되지 않은 파일 이름입니다.

관련 정보