`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

에서 확장된 globbing 패턴을 사용하려면 어떤 방식으로든 셸 옵션을 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)'

dotglob및 옵션을 추가로 설정하면 nullglob스크립트는 숨겨진 이름과 일치하고 일치하는 항목이 없으면 (확장되지 않은 패턴을 인쇄하는 대신) 빈 줄 하나를 인쇄합니다.

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

관련 정보