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_ENV
Bash는 지정된 파일을 읽지만 이에 의존하지 않는 것이 좋습니다. 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)