의 POSIX 사양의 최신 (2017 년 기준) 버전 rm
유틸리티입니다 여기 (및 이전 이 )과의 삭제를 금지 .
하고 ..
.
파일 dot 또는 dot-dot 중 하나가 피연산자의 기본 이름 부분 (즉, 최종 경로 이름 구성 요소)으로 지정되거나 피연산자가 루트 디렉토리로 해석되는 경우 rm은 진단 오류를 표준 오류에 기록하고 아무 것도 수행하지 않습니다. 그러한 피연산자로 더.
@jlliagre가 지적했듯이 /
SUSv4의 추가 부분 이 있습니다.
내가 찾을 수있는 가장 오래된 공개 유닉스 사양 ( XPF4 CAE의 REV2 (1994)), 이미 지정 .
과 ..
는 GNU fileutils에 속하는 명령어 변경 로그에 주석이 이미 오래된 POSIX 사양에서의 경우와 제안하지만, 제거 할 수 없습니다.
그것은에 적용됩니다 dir/..
및 ../
뿐만 아니라,하지만 (솔라리스 11과 맥 OS와 같은 UNIX 인증을 포함한) 일부 구현은 여전히에 대해 보호하지 않습니다 rm -rf ../
또는 rm -rf .*/
).
역사
초기 유니스
-r
옵션에 rm
그것은 단지 디렉토리의 내용을 삭제 되었더라도 유닉스 V3 (1973)에서 추가되었다, 당신은 여전히 사용해야 할 것 rmdir
디렉토리를 제거 할 수 있습니다.
이는 Unix V7 (1979, Bourne 쉘을 도입했으며 대부분의 Unices에서 파생 된 릴리스)에서 변경되었습니다. rm -r
이제 디렉토리도 제거되었으며 ..
디렉토리 트리는 삭제되지 않습니다 . 맨 페이지 상태 :
..
실수로 같은 일을하는 반사회적 결과를 피하기 위해 파일을 제거하는 것은 금지되어 rm -r .*
있습니다.
( 포함되어 있기 때문에 모든 것을 삭제하므로 rm -r .*
여전히 반 사회적 이라고 주장 할 수 .
있습니다).
또는 항목을 링크 .
해제하지 않더라도 여전히 제거를 수락했습니다 . 따라서 현재 디렉토리를 비우는 효과적인 방법이었습니다..
..
rm -r .
또한 보호는 리터럴에 대한 것을주의 ..
하지 않는, 인수 dir/..
또는 ./..
. 따라서 rm -rf ./.*
여전히 상위 디렉토리의 모든 항목을 재귀 적으로 제거합니다.
그것은 그 globs와가 포함 할 수있는 버그 / misfeature 해결하기 위해 이미 있는지 흥미 .
와 ..
자신의 확장에있다. 즉,이 포 시스 쉘 80 년대 후반 (원래 미닉스 쉘 및 pdksh 같은에 대한 기준), 수정되었습니다 zsh
(1990)와 fish
(2005)가 아닌 다른 껍질이 아니라 POSIX의 특히 sh
의 확장을 필요로 언어를 .*
포함 .
하고 ..
있는 경우 그들은에 의해 반환됩니다 readdir()
( bash
에서만 부분적으로 문제를 해결 shopt -s dotglob
제외하고 globs와 (여기서 .xxx
사람)가 포함되어 있지 않습니다 .
또는 ..
,와 함께 ksh
, 당신은 수행하여 문제를 해결할 수 있습니다 FIGNORE='@(.|..)'
).
정확히 금지 .
된 내용도 추가 되었을 때 항상 명확한 것은 아니며 각 유닉스에 따라 다릅니다. 아래 몇 가지 결과.
BSD
금지는 .
2.9BSD (1983)와 2.10BSD (1987) 사이, 4.2BSD (1983)와 4.3BSD (1986) 사이에 추가되었다 ( unix-history-repo에서 1985 년 타임 스탬프가 변경됨 참조 ).
$ wget -qO- http://www.tuhs.org/Archive/PDP-11/Distributions/ucb/2.9BSD/root.tar.gz |
zgrep -ao 'rm: canno[[:print:]]*'
rm: cannot remove `..'
$ wget -qO- http://www.tuhs.org/Archive/PDP-11/Distributions/ucb/2.10bsd.tar.gz |
zgrep -ao 'rm: canno[[:print:]]*'
rm: cannot remove `.' or `..'
rm: cannot remove `.' or `..'\n");
들어 dir/.
와 dir/..
, 참조 1988 년이 변경 (BSD 4.3 인터넷 / 1).
이 현재까지 rm
의 FreeBSD의 (그리고 맥 OS와 같은 파생 상품은) 여전히시 현재 또는 부모 디렉토리를 비워 rm -rf ./
또는 rm -rf ../
(문제에 대한 불구하고 rm -rf .*/
).
시스템 V
V7 이후 AT & T Unix 파생 상품에 대해 소스 나 바이너리를 공개적으로 사용할 수 없기 때문에 많은 정보가 없습니다. 온라인 매뉴얼에서 HPUX (System III 기반)는 여전히 ..
적어도 금지하고 있지만 실제로는 적어도 SysIII가 삭제를 금지하지 않았 음을 나타냅니다 .
( 편집 : SysIII rm
소스 코드 를 보면, Unix V7 이후 거의 변경되지 않았습니다.
POSIX를 준수 해야하는 삭제를 언급 .
했거나 ..
금지 된 다른 모든 온라인 매뉴얼 .
솔라리스는 rm
여전히시 현재 또는 부모 디렉토리를 비워 rm -rf ./
나 rm -rf ../
.
암소 비슷한 일종의 영양
GNU fileutils 의 초기 변경 로그 에는 모든 기록 정보가 있습니다.
원래는 삭제 .
되거나 ..
금지 되지 않았지만 1990 년에서 1991 년 사이에 ..
먼저 금지 된 다음 모두 금지 (포함 dir/.
) 가 금지되었습니다 .
다른
우리가 보았 듯이,에서 zsh
의 확장 .*
(또는 글로브는) 결코 포함되지 않습니다 .
또는 ..
(심지어에서 sh
에뮬레이션 모드). rm
(당신이 경우 얻을 내장은 zmodload zsh/files
) 때문에 취급하지 않습니다 .
또는 ..
특별. 그래서, 그와 zsh
내장, 당신은 할 수 있습니다 rm -rf .
또는 rm -rf ..
비 웁니다 .
또는 ..
하지만 rm -rf .*
제거하지 않습니다 .
나 ..
.
busybox rm
에서 삭제 금지 .
및 ..
0.52 (2001)에 추가됨
rm
,하지만 난 당신이 여전히 예기치 않은 결과를 가질 수 있음을 언급 할 가치라고 생각chmod
,chown
일치하는 경우 등.*
.