이 표현식은 .*
bash에 의해 확장되어 현재 디렉터리와 상위 디렉터리를 포함합니다.
$ ls -la
total 2600
drwxrwxrwx 2 terdon terdon 2162688 Sep 10 16:22 .
drwxr-xr-x 142 terdon terdon 491520 Sep 10 15:34 ..
-rw-r--r-- 1 terdon terdon 0 Sep 10 16:22 foo
$ echo .*
. ..
rm -rf .*
GNU bash를 사용하여 Debian에서 실행 version 4.2.36(1)-release
하고 rm
from 에서 실행 하면 rm (GNU coreutils) 8.13
다음 메시지가 나타납니다.
$ rm -rf .*
rm: cannot remove directory: `.'
rm: cannot remove directory: `..'
이것은 GNU입니까 아니면 POSIX입니까? 위 명령이 자동으로 삭제 .
되는 *nix 시스템이 있습니까 ..
?
또한 이것이 rm
쉘의 보안 기능입니까, 아니면 명령 자체입니까?
답변1
이 유틸리티에 대한 POSIX 사양의 최신 버전(2017년 기준) 은 다음과 rm
같습니다.여기(이전 글도 그렇고거기) 및 및 삭제를 금지 .
합니다 ..
.
파일 점 또는 점 점(dot-dot)이 피연산자의 기본 이름 부분(즉, 최종 경로 이름 부분)으로 지정되거나 피연산자가 루트 디렉터리로 확인되는 경우 rm은 표준 오류에 진단 메시지를 쓰고 더 이상 아무것도 하지 않아야 합니다. .
@jlliagre가 지적했듯이 관련 부분은 /
SUSv4의 새로운 기능입니다.
내가 찾을 수 있는 가장 오래된 공개 유닉스 사양(XPF4 CAE 개정 2(1994)), 이는 지정되었으며 .
제거 ..
할 수 없습니다. 단, GNU fileutils 변경 로그의 주석에는 이것이 이전 POSIX 사양에 이미 존재했음을 나타냅니다.
dir/..
및 에서도 작동 하지만 일부 구현(Solaris 11 및 macOS와 같은 UNIX 인증 구현 포함)은 여전히 또는 ../
로부터 보호하지 않습니다 .rm -rf ../
rm -rf .*/
역사
초기 유니스
-r
이 옵션은 Unix V3(1973)에 추가되었으며 rm
디렉터리의 내용만 삭제 하지만 rmdir
디렉터리를 삭제하려면 여전히 이 옵션을 사용해야 합니다.
이러한 상황은 Unix V7(1979, Bourne 쉘을 도입하고 대부분의 Unices가 파생됨)에서 변경되었습니다. rm -r
이제 디렉터리도 삭제되고 ..
디렉터리 트리는 삭제되지 않습니다. 이것매뉴얼 페이지상태:
..
실수로 비슷한 일을 하여 반사회적인 결과를 피하기 위한 목적으로만 파일을 삭제하는 것은 금지되어 있습니다rm -r .*
.
rm -r .*
(누군가는 이것이 아직이라고 말할 수도 있지만사회에 어긋난다포함된 모든 것을 제거하기 때문입니다 .
.
여전히 삭제를 허용 하지만 연결을 해제 하거나 항목을 입력 .
하지는 않습니다 . 그런 다음 현재 디렉터리를 지우는 것이 효과적인 방법입니다..
..
rm -r .
또한 보호는 리터럴 ..
인수 에만 적용되며 dir/..
또는 에는 적용되지 않습니다 ./..
. 따라서 rm -rf ./.*
상위 디렉터리의 모든 항목은 여전히 재귀적으로 삭제됩니다.
흥미롭게도 이는 .
glob이 확장할 수 있는 버그/버기 기능을 이미 해결했습니다. 이 문제는 1980년대 후반(1990)과 (2005)에 Forsyth 쉘(원래 Minix 쉘과 pdksh의 기반)에서 수정되었지만 ..
다른 쉘, 특히 확장 기능을 포함해야 하는 POSIX 언어에서는 수정되지 않았습니다. (그롭을 제외한) glob에 or 가 포함되어 있지 않은 문제의 일부만 해결하고 을 사용하면 다음을 수행하여 문제를 해결할 수 있습니다.zsh
fish
sh
.*
.
..
readdir()
bash
shopt -s dotglob
.xxx
.
..
ksh
FIGNORE='@(.|..)'
정확히 금지 사항이 추가되는 경우가 .
항상 명확한 것은 아니며 각 Unix에 따라 다릅니다. 다음은 몇 가지 결과입니다.
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(및 macOS와 같은 파생 제품)는 여전히 현재 디렉터리나 상위 디렉터리를 지웁니다 rm -rf ./
( rm -rf ../
중요함 rm -rf .*/
).
시스템 V
V7 이후의 AT&T Unix 파생 제품에 대한 소스 코드나 바이너리가 공개적으로 제공되지 않기 때문에 정보가 많지 않습니다. 온라인 매뉴얼에서 HPUX(System III 기반)는 여전히 제거만 비활성화한다고 언급 ..
하지만 실제로는 두 가지 모두 비활성화합니다. 이는 적어도 SysIII가 제거를 비활성화하지 않을 수 있음을 의미합니다 .
(편집하다: 보고있다SysIII rm
소스 코드, Unix V7 이후 거의 변경되지 않았습니다).
내가 확인한 다른 모든 온라인 매뉴얼에는 POSIX와 호환되어야 하는 제거 .
또는 억제에 대한 언급이 있습니다...
Solaris는 여전히 rm
현재 디렉토리나 상위 디렉토리를 비웁니다.rm -rf ./
rm -rf ../
암소 비슷한 일종의 영양
이것GNU fileutils의 초기 변경 로그모든 역사적 정보가 있습니다.
처음에는 제거되거나 금지되지 .
않았지만 1990 년과 1991년 사이에 먼저 금지된 다음 둘 다(포함) 금지되었습니다 ...
..
dir/.
다른
보시다시피, zsh
, (또는 모든 glob)의 확장 에는 또는 (심지어 시뮬레이션 모드에서도) .*
이 포함되지 않습니다 . 따라서 내장 함수 (이렇게 하면 얻을 수 있음 )는 특별히 취급 되지 않습니다 . 따라서 해당 내장 기능을 사용하면 해당 항목 을 지울 수도 있고 삭제할 수는 없습니다 ..
..
sh
rm
zmodload zsh/files
.
..
zsh
rm -rf .
rm -rf ..
.
..
rm -rf .*
.
..
Busybox 0.52(2001)에는 합계 rm
삭제를 비활성화하는 .
기능이 추가되었습니다...