이와 같은 작업을 수행하는 것은 좋지 않은 생각이라는 것은 잘 알려져 있습니다. <command> $FILENAME
예를 -<option>
들어 <command>
해당 파일 -<option>
을토론, <command>
다음과 같이 실행됩니다.옵션 -<option>
.
그렇다면 이를 달성할 수 있는 보편적이고 안전한 방법이 있습니까? 한 가지 가정은 filename 앞에 추가하는 것이지만 --
이것이 100% 안전한지 확실하지 않으며 이 옵션이 없는 명령이 있을 수 있습니다.
답변1
첫째, 항상 큰따옴표로 변수를 묶으십시오(이 규칙에는 예외가 있지만 때가 되면 쉽게 알아볼 수 있습니다). 공백 문자가 포함된 파일 이름의 위험은 빼기 기호로 시작하는 파일 이름보다 높습니다(아마도 더 높음).
따라서 첫 번째 명령은 다음과 같아야 합니다.
<command> "$FILENAME"
다음은 -<option>
경우입니다. 문제를 훌륭하게 요약했습니다. 사용은 --
괜찮지만 --
모든 명령이 이 구문을 지원하지 않기 때문에 맹목적으로 명령에 추가할 수는 없습니다.
./file
빼기 기호(또는 기타 민감한 문자)로 시작하는 파일 이름이 포함된 변수를 방지하는 완전히 안전한 방법은 파일 이름 앞에 상대 경로( ) 또는 절대 경로( ) 가 오도록 변경하는 것입니다 /foo/bar/file
. 이렇게 하면 첫 번째 문자는 .
또는 이므로 무해합니다 /
.
$filename
이 코드는 이미 절대 경로가 아닌 이상 상대 경로를 추가합니다 .
[[ "$filename" != /* ]] && filename="./$filename"
개인적으로 저는 쉘 스크립트에서 파일 매개변수를 표준 표현(전체 경로)으로 변경하는 것을 선호합니다.
filename="$(readlink -f -- "$filename")"
또는:
filename="$(realpath -m -- "$filename")"
(어떤 것을 사용해야 하는지 알고 싶다면 다음을 참조하세요 realpath
.readlink
이 훌륭한 답변)