!(*.sh)는 명령줄에서는 작동하지만 스크립트에서는 작동하지 않습니다.

!(*.sh)는 명령줄에서는 작동하지만 스크립트에서는 작동하지 않습니다.

Ubuntu의 터미널에서 다음 코드를 사용하면 제대로 작동합니다.

rm !(*.sh) -rf

하지만 동일한 코드 줄을 쉘 스크립트( clean.sh)에 넣고 터미널에서 쉘 스크립트를 실행하면 아래와 같이 오류가 발생합니다.

clean.sh 스크립트:

#!/bin/bash
rm !(*.sh) -rf

내가 얻는 오류 :

./clean.sh: line 2: syntax error near unexpected token `('
./clean.sh: line 2: `rm !(*.sh) -rf'

도와주세요?

답변1

다음을 활성화해야 합니다 extglob.

shopt -s extglob

답변2

배쉬에서는 일부무늬기본적으로 활성화되어 있지 않지만 옵션을 설정하여 활성화할 수 있습니다.shopt. 초기 Unix 셸에는 존재하지 않았던 Modes !(NOT-THIS), @(THIS|THAT)*(ZERO-OR-MORE)는 나중에 ksh에 추가되었으며 POSIX에서 표준화되지 않았으며 기본적으로 인식되지 않으므로 먼저 실행해야 합니다.+(ONE-OR-MORE)?(OPTIONAL)shopt -s extglob

명령줄에서 이러한 모드를 사용할 수 있습니다. 이는 스크립트가 아닌 대화형 셸에서만 shopt -s extglob.file을 읽을 수 있음을 나타냅니다..bashrc

(Bash가 스크립트 실행을 시작할 때 환경 변수를 설정하면 BASH_ENVBash는 지정된 파일을 읽지만 이에 의존하지 않는 것이 좋습니다. BASH_ENV예상한 값으로 설정된 경우에만 스크립트가 작동하도록 하기 때문입니다. 가리키는 파일을 변경하지 않는 경우에만).

shopt -s extglob스크립트 상단의 줄 아래에 포함시키면 됩니다 #!/bin/bash.

답변3

쉘 스크립트 방법

기본적으로 glob은 BASH 스크립트에 아무런 영향을 미치지 않습니다(단, 로 활성화할 수는 있음 shopt). BASH가 아닌 인터프리터로 쉘 스크립트를 실행하면 glob이 전혀 작동하지 않을 수 있습니다.

이 명령을 사용하면 동일한 효과를 얻을 수 있습니다 find. 이는 제가 권장하는 것입니다(요구 사항이 증가하면 더 많은 제어권을 가지므로).

사이즈에 맞게 입어보세요:
find . -mindepth 1 -maxdepth 1 -not -iname "*.sh" -exec rm -rf {} \;

파일 생성 방법

취할 수 있는 또 다른 접근 방식은 다음과 같습니다.

나중에 정리하고 싶은 작업을 수행하는 경우에는 clean.sh, build.sh, install.sh 등이 아닌 Makefile이 해당 작업에 적합한 도구일 수 있습니다.

이는 레시피가 항상 순서대로 발생하도록 하거나 출력을 생성한 레시피를 항상 다시 실행하고 싶지 않은 경우에 특히 그렇습니다.

동일한 작업을 수행하는 간단한 Makefile은 다음과 같습니다. (
앞의 공백은 rm스크롤을 만드는 방법이므로 탭이어야 합니다.)

SOURCES := $(wildcard *.sh)
CLEAN_FILES := $(filter-out $(SOURCES),$(wildcard *))
CLEAN_FILES := $(filter-out Makefile,$(CLEAN_FILES))

build: $(SOURCES)
    YOUR_RECIPE_HERE

clean:
    rm -rf $(CLEAN_FILES)

관련 정보