왜 명령을 사용해야합니까?
rm -rf "`pwd`/folder"
바꾸다
rm -rf ./folder
둘 중 하나를 선택해야 하는 이유가 있나요?
답변1
rm -rf "`pwd`/folder"
안타깝지만 사용하면 안 됩니다. 이는 극단적인 경우에만 발생하지만 이러한 극단적인 경우에는 잘못된 디렉터리가 삭제되는 보안 문제가 될 수 있습니다. 극단적인 경우는 현재 디렉토리가 개행으로 끝나는 것입니다. 명령 대체는 후행 개행을 제거하므로 현재 디렉토리가 /some/where/strange⏎
(여기서 ⏎는 개행을 나타냄) 경우 이 명령은 대신 삭제됩니다 /some/where/strange
.
이 변형은 이 명령을 사용하는 것에 비해 rm -rf "$PWD/folder"
단점이 없으며 pwd
장점은 후행 개행의 코너 케이스로 인해 어려움을 겪지 않는다는 것입니다. 모든 Bourne/POSIX 쉘은 PWD
모든 디렉토리 변경 명령( 등) cd
후에 변수를 업데이트하며 pushd
내장 명령 출력과 동일한 값을 갖습니다. pwd
(외부 pwd
명령은 출력이 다를 수 있지만 1. pwd
내장 명령이 존재하고 모든 공통 쉘에 하나가 있으면 내장 명령이 호출되고 2. 어쨌든 여기서 외부 명령을 사용해도 이점이 없습니다.)
rm -rf "$PWD/folder"
하지만 에 비해 장점은 없습니다 rm -rf ./folder
. 피팅 시 최대 명령줄 길이를 rm -rf "$PWD/folder"
잠재적으로 초과할 수 있다는 이론적 단점이 있습니다 . rm -rf ./folder
그러나 최대 명령줄 길이는 거의 항상 최대 파일 경로 길이보다 상당히 크므로 단일 경로를 사용하는 명령은 거의 항상 적합합니다.
"$PWD/$foo"
대신 사용 "$foo"
하면 대시로 시작하지 않는다는 장점이 있습니다.옵션인 것 같다. 변수인 경우에만 경로가 스크립트에 명시적으로 표시된 경우에는 문제가 되지 않습니다. "./$foo"
동일한 보호를 제공합니다 . 상대 경로인 경우에만 "$PWD/$foo"
정확합니다 . 그래서 비교해서 장점이 없습니다. 위에서 언급했듯이 더 짧은 상대 형식을 사용하면 많은 경로가 관련된 경우 명령줄 길이 제한을 유지하는 데 도움이 될 수 있습니다."./$foo"
$foo
rm -rf "$PWD/$foo"
rm -rf "./$foo"
를 사용하면 나중에 사용하기 위해 변수에 저장하는 것보다 "$PWD/folder"
분명한 이점이 있습니다 "./folder"
. 그 동안 스크립트가 다른 디렉터리로 변경되더라도 계속해서 동일한 파일을 지정합니다. rm -rf "./folder"
완전히 괜찮지 만 이와 같은 코드에는 절대 경로가 필요합니다.
output_directory="$PWD/output"
# If interrupted, delete the partial output.
trap 'rm -rf "$output_directory"; exit 1' HUP INT TERM
do_stuff >"$output_directory/file1"
do_more_stuff >"$output_directory/file2"
cd "$output_directory"
further_stuff file1 file2 >file3
$output_directory
상대 경로인 경우 삭제 코드는 명령 cd
전후에 작동할 수 있지만 둘 다에는 작동하지 않습니다.