대신 무엇을 원하십니까? 전혀 달리지 rm
않습니까 (1)? *
다른 Bourne과 같은 쉘 (2)과 같은 리터럴 인수로 실행 합니까? 전혀 논쟁없이 그것을 실행 (3)?
files=(*(N)); (($#files)) && rm -- $files
. 또는 (rm -- *) 2> /dev/null
그것은 또한 rm
어리석은 진정한 오류를 숨길 것입니다. zsh
오류를 무시할 수는 있지만 rm
명령을 위해 stderr을 복원하십시오.(rm -- * 2>&3 3>&-) 3>&2 2> /dev/null
emulate sh -c 'rm -- *' 2> /dev/null
. 에서와 같은 그런 sh
어떤 zsh
이제 단일 명령 줄을 에뮬레이트, 비 매칭 *
에 그대로 전달 rm
하고 rm
그 같은 불평 *
파일이 존재하지 않습니다. 우리는 억제 rm
당신이 할 것 같은의 표준 에러를 sh
억제하는 오류 메시지, 그러나 다시, 그것은으로 정품 오류 숨길 것 같은 바보가 rm
의 잘못된 행동에 의해 발생하는 오류에 반대 sh
리터럴을 전달 *
하는 방법에 대해 rm
. rm -f '*'
존재하지 않는 *
파일 에 대해 불평 하지 않으므로 할 수 있습니다.emulate sh -c 'rm -f -- *'
rm -- *(N)
. rm
하지만 다시, 어떤 인수를 전달하지 않을 때는 아니지만 불평 것 rm -f
: rm -f -- *(N)
.
일반적으로, rm -f
모든 파일을 삭제하고 파일을 제거 할 수 없거나 IOW가 여전히 rm
리턴 된 후에 만 오류가 발생하는 경우 사용하려는 명령 입니다. 또한 일반적으로 -f
일부 상황에서 사용자에게 프롬프트가 표시되지 않도록 스크립트에 사용하려고합니다.
여기서 rm
glob이 일치하지 않을 때 호출하는 것이 잘못되었습니다. sh
한 행동은 잘못된 것입니다. 같은 패턴의 경우 무해 *
하지만 같은 패턴의 경우 일치하지 않으면 그대로 *.[ch]
전달 *.[ch]
하면 *.[ch]
파일이 실수로 제거 될 수 있습니다 .
$ ls
*.[ch] foo.txt
$ zsh -c 'rm *.[ch]'
zsh:1: no matches found: *.[ch]
$ ls
*.[ch] foo.txt
$ sh -c 'rm *.[ch]'
$ ls
foo.txt
오류와 함께 실패하는 것은 할 수있는 가장 현명한 일이며, 무엇을 zsh
(그리고 fish
, csh
, tcsh
, bash -o failglob
원래 유닉스 쉘)한다.
그리고 특별한 경우를 스스로 돌보고 싶다면 위의 (1)과 같이 glob 한정자 ( noglob )를 zsh
사용하여 쉽게 만드십시오 . (적어도 최신 버전에서는 ) 명령에 대한 암시 적 noglob 를 수행하는 것처럼 훨씬 쉽습니다 . 따라서 이에 상응하는 내용은 다음과 같습니다.(N)
fish
set
set files *
if count $files > /dev/null
rm -f -- $files
end
자세한 내용 은 nullglob가 기본값이 아닌 이유 를 참조하십시오.
1 . 엄밀히 말하면 그것은 sh
Bourne 쉘 (1979 년 Unix V7 이후) 이후입니다. 이전 버전 sh
(전화를했다 /etc/glob
곳이다 인용 부호로 둘러싸이지 않은 와일드 카드에 글로브의 이름에서 유래가)처럼 행동했다 csh
또는 zsh -o cshnullglob
이다가, /etc/glob
globs와의 아무도 어떤 경기가 없었다 경우 명령을 취소 것 (적어도 경우 일치하지 않는 globs와 억제 것 그들 중 하나가 일치했습니다). Bourne 쉘 이 동작을 중단 했습니다.