에서:http://seclists.org/fulldisclosure/2011/Sep/190
[USER@MACHINE ~] mkdir ejha
[USER@MACHINE ~] cd ejha/
[USER@MACHINE ~/ejha] touch ize
[USER@MACHINE ~/ejha] touch -- -f -i
[USER@MACHINE ~/ejha] ls -l
total 0
-rw-rw-r--. 1 USER USER 0 Sep 20 19:44 -f
-rw-rw-r--. 1 USER USER 0 Sep 20 19:44 -i
-rw-rw-r--. 1 USER USER 0 Sep 20 19:44 ize
[USER@MACHINE ~/ejha] rm *
rm: remove regular empty file `ize'? y
[USER@MACHINE ~/ejha] ls -l
total 0
-rw-rw-r--. 1 USER USER 0 Sep 20 19:44 -f
-rw-rw-r--. 1 USER USER 0 Sep 20 19:44 -i
[USER@MACHINE ~/ejha]
시스템에 대한 정보:
[USER@MACHINE ~/ejha] echo $SHELL
/bin/bash
[USER@MACHINE ~/ejha] lsb_release -a
LSB Version: :core-4.0-ia32:core-4.0-noarch
Distributor ID: Fedora
Description: Fedora release 14 (Laughlin)
Release: 14
Codename: Laughlin
[USER@MACHINE ~/ejha] rpm -qa | fgrep bash
bash-4.1.7-4.fc14.i686
[USER@MACHINE ~/ejha]
왜? "-f" 및 "-i" 파일을 삭제하지 않는 이유는 무엇입니까?
답변1
파일 이름을 매개 변수(따옴표 없이 이 경우 *
확장됨 -f -i ize
)로 인식하기 때문에 제거하지 않습니다. 이러한 파일을 삭제하려면 rm -- *
또는 를 실행합니다 rm ./*
. --
매개변수의 끝을 표시하고 ./
현재 디렉터리에 대한 링크를 사용하여 rm
매개변수 감지를 우회합니다.
일부 프로그램에서는 중지 확인 인수를 ./*
허용하지 않기 때문에 종종 선호됩니다.--
이것은 실수가 아닙니다. rm
이러한 문제를 방지하려면 올바른 방법으로 호출하여 처리 해야 합니다 .
답변2
약간의 명확성을 추가하기 위해 "*"는 "rm"이 아닌 쉘에 의해 확장되므로 "rm" 명령은 파일 목록을 인수로 가져옵니다. 따라서 귀하의 예에서 "rm *"은 "rm -f -i ize"를 입력하는 것과 정확히 같습니다.
다른 시스템(예: Windows/DOS 명령줄)에서 "*"는 명령 자체를 통해 파일 목록으로 확장되므로 명령은 일치하는 모든 파일이 파일임을 "인식"합니다. 이 접근 방식의 단점은 각 명령이 와일드카드를 구현하고 와일드카드 구성 및 인용 규칙 등을 다시 구현해야 한다는 것입니다.