쉘 스크립트를 좀 더 안전하게 만들려고 노력 중입니다. 어떤 이유로 변수가 정의되지 않은 경우 기본값 사용을 고려합니다. 예를 들면 다음과 같습니다.
rm -r "${OUTPUT_DIR:-/dev/null/this_path_does_not_exists}"
존재하지 않는 경로를 사용하는 것이 제가 생각해낸 해결책입니다. 그러다가 시스템 전체의 수신자( )가 있다면 /dev/null
시스템에 영향을 주지 않고 안전하게 삭제할 수 있는 파일이나 더미 파일이 있지 않을까 하는 생각이 들었습니다. 그래서 제 질문은 다음과 같습니다. 다음에 대한 파일이 있습니까?
- 손상, 기능 손실 또는 데이터 손실 없이 삭제 가능
- 자동으로 "재생성"됩니다(시스템에서 먼저 삭제되지 않을 수도 있음).
- 슈퍼유저로 삭제해도 삭제되지 않습니다. (놀랍게도 /dev/null이 삭제될 수 있습니다 :))
답변1
항상 존재하지만 언제든지 삭제될 수도 있는 파일(또는 디렉터리)을 찾아내려고 하기보다는 변수를 사용하기 전에 명시적으로 확인하는 것이 어떨까요?
[ -d "$OUTPUT_DIR" ] && rm -r -- "$OUTPUT_DIR"
비어 있거나 존재하지 않거나 디렉터리가 아닌 항목을 가리키는 경우 $OUTPUT_DIR
아무것도 삭제하려고 시도하지 않습니다.
답변2
rm -f
또는 rm -rf
아무것도 하지 않고 인수가 전달되지 않아도 불평하지 않으며 일반적으로 -f
사용자에게 메시지가 표시되지 않도록 스크립트에서 이것을 사용하려고 하므로 다음과 같이 할 수도 있습니다.
rm -rf -- ${OUTPUT_DIR:+"$OUTPUT_DIR"}
IIRC에서도 이것이 작동한다고 보장할 수 없습니다 rm -rf -- "$OUTPUT_DIR"
. 일부 시스템은 빈 문자열을 현재 작업 디렉토리로 취급합니다( rm
이를 거부하지 않았다면 분명히 극적일 것입니다 rm -rf .
).
[ -z "$OUTPUT_DIR" ] || rm -rf -- "$OUTPUT_DIR"
제 생각에는 더 길지도, 더 명확하지도 않습니다.
또한보십시오:
rm -rf -- "${OUTPUT_DIR:?No output dir!}"
$OUTPUT_DIR
설정되지 않거나 비어 있으면 셸이 오류와 함께 종료됩니다.
답변3
/dev/null/something
/dev/null
보증이 존재하고 디렉토리가 아니기 때문에 보증이 존재하지 않습니다 .
또는 빈 문자열을 사용할 수 있습니다. 이는 유효한 파일 이름이 아니라는 것이 보장됩니다. 그러나 변수가 다른 것과 연결되면 빈 문자열은 위험합니다.
하지만 실수로 변수를 설정하지 않고 사용할까 봐 걱정된다면set -u
(모든 sh 스타일 쉘에 적용됩니다). 그러면 자동으로 null을 사용하는 대신 정의되지 않은 변수를 사용하려고 하면 오류가 발생합니다.
(파일이 항상 존재하도록 예약할 수 있으며 삭제 시도는 성공한 것처럼 보이지만 사용자 정의를 사용하여 파일을 그대로 유지합니다.퓨즈. 하지만 이것이 어떻게 도움이 되는지 모르겠습니다. 여기서는 rm
성공을 보장하는 파일이 아니라 실패를 보장하는 파일이 필요합니다. )
$OUTPUT_DIR
보안 관련: 절대 경로 로 설정하지 않은 이상 -
옵션처럼 보이는 로 시작할 수 있습니다. 따라서 --
어떤 명령에든 전달할 때는 반드시 그 앞에 전달해야 합니다.
rm -r -- "$OUTPUT_DIR"