괄호는 bash 쉘 자체에서는 작동하지만 bash 스크립트에서는 작동하지 않습니다.


11

명령 행 프롬프트에서이 명령을 실행할 수 있습니다.

cp -r folder/!(exclude-me) ./

서브 디렉토리 를 folder 제외한 모든 컨텐츠를 exclude-me현재 디렉토리에 재귀 적으로 복사합니다 . 의도 한대로 작동합니다. 그러나 필자가 작성한 bash 스크립트에서 작동하려면 이것이 필요합니다.

if [ -d "folder" ]; then
  cp -r folder/!(exclude-me) ./
  rm -rf folder
fi

그러나 스크립트를 실행할 때 :

bash my-script.sh

나는 이것을 얻는다 :

my-script.sh: line 30: syntax error near unexpected token `('
my-script.sh: line 30: `  cp -r folder/!(exclude-me) ./'

그리고 왜 명령 프롬프트에서 작동하는지 잃어 버렸지 만 bash 스크립트에서는 정확히 같은 줄이 작동하지 않습니다.

답변:


11

사용하는 구문은 비 대화식 쉘 (스크립트)에 대해 기본적으로 활성화되지 않은 특정 bash 기능에 의존하기 때문입니다. 스크립트에 관련 명령을 추가하여 활성화 할 수 있습니다.

## Enable extended globbing features
shopt -s extglob

if [ -d "folder" ]; then
  cp -r folder/!(exclude-me) ./
  rm -rf folder
fi

다음은 관련 섹션입니다 man bash.

   If the extglob shell option is enabled using the shopt builtin, several
   extended  pattern  matching operators are recognized.  In the following
   description, a pattern-list is a list of one or more patterns separated
   by a |.  Composite patterns may be formed using one or more of the fol
   lowing sub-patterns:

          ?(pattern-list)
                 Matches zero or one occurrence of the given patterns
          *(pattern-list)
                 Matches zero or more occurrences of the given patterns
          +(pattern-list)
                 Matches one or more occurrences of the given patterns
          @(pattern-list)
                 Matches one of the given patterns
          !(pattern-list)
                 Matches anything except one of the given patterns

이것은이 대답을 찾는 두 번째입니다 (예, 나쁜 기억). 노력이 시간은 실행 넣어 env > file1스크립트와 실행 ./it하고 env > file2그리고 source it난에 차이가 발견 거라고 희망, env사실이 아니다들. 두 셸 (이 경우 대화식 대 비 대화식)의 차이점을 프로그래밍 방식으로 나열하려면 어떻게해야합니까?
엔리코 마리아 데 안젤리 스


2

스크립트 상단에 다음 줄을 추가하십시오.

shopt -s extglob

!(...)확장 패턴 일치 기능이므로 extglob사용 하려면 옵션 enable 이 필요 합니다. 자세한 내용은 shopt builtin 을 참조하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.