zsh
주어진 명령으로 모든 파일을 삭제할 수 있다고 가정하면 :
>*
noclobber
이 옵션을 설정하는 것이 좋다고 생각합니다 .
>| file
bash 및 zsh에서 기본 파괴 동작을 사용하려면 언제든지 이를 사용할 수 있습니다. (zsh는 대체 구문도 허용합니다 >!file
).
noclobber
POSIX 호환성 때문에 기본적으로 설정되어 있지는 않을 것 같지만 다음 사항을 확인하세요 .
설정에 단점이 있나요 noclobber
?
noclobber
대화형 쉘에만 이것을 설정하는 방법이 있습니까?
답변1
noclobber
기본값을 설정하지 않는 이유는 전통 때문입니다. 사용자 인터페이스 디자인의 문제로 "이 새 파일 만들기"를 간단한 작업으로 만들고 "새 파일 만들기 또는 기존 파일 덮어쓰기"보다 더 위험한 작업에 대한 추가 장벽을 만드는 것이 좋습니다. 따라서 noclobber
좋은 생각입니다( >
새 파일 생성, >|
기존 파일 덮어쓰기 가능). 셸이 수십 년 후에 설계되었다면 아마도 기본값이 될 것입니다.
대화형 셸 시작 파일에 다음 ( .bashrc
또는 )을 사용하는 것이 좋습니다 .zshrc
.
set -o noclobber
alias cp='cp -i'
alias mv='mv -i'
각 경우(리디렉션, 복사, 이동)의 목표는 기존 데이터를 지우는 것이 작업의 기본 목표가 아니더라도 작업으로 인해 일부 기존 데이터를 지우는 부작용이 있을 수 있을 때 추가 장애물을 추가하는 것입니다. rm -i
데이터 삭제가 이기 때문에 이 목록 에 포함하지 않았습니다 rm
.
양해해 주십시오 noclobber
.-i
안전망. 트리거되면,너 무슨 잘못했어?. 그러므로 당신이 다루고 있는 내용을 확인하지 않기 위한 변명으로 사용하지 마십시오! 요점은 출력 파일이 존재하지 않는지 확인해야 한다는 것입니다. file exists: foo
또는 이라는 말을 들었다면 overwrite 'foo'?
이는 실수를 했다는 의미이므로 기분이 나쁘고 더 조심해야 한다는 의미입니다. 특히, 프롬프트가 덮어쓰여지는지 말하는 습관을 들이지 마십시오 y
(별칭은 이어야 alias cp='yes n | cp -i' mv='yes n | mv -i'
하지만 Ctrl+를 누르면 C출력이 더 좋아 보입니다). 정말로 덮어쓰려면 명령을 취소하고 출력을 이동하거나 삭제하십시오. 파일을 삭제하고 다시 시도하세요. 이 명령을 실행하세요.
또한 이러한 보안 조치를 실행하는 습관을 들이지 않는 것도 중요합니다. 그렇게 하면 언젠가는 구성이 없는 컴퓨터를 사용하게 되고 의존했던 보호 기능이 손상되어 데이터를 잃게 될 것이기 때문입니다. 더 이상 효과적이지 않습니다. 저기.
noclobber
대화형 쉘에서만 읽을 수 .bashrc
있으므로 대화 형 쉘에만 설정됩니다 . .zshrc
물론, 스크립트에 영향을 미치는 방식으로 쉘 옵션을 변경하면 안 됩니다. 스크립트가 손상될 수 있기 때문입니다.
답변2
단점은 활동적인 활동에 익숙하다면 noclobber
언젠가는 해당 시스템에 맞게 설계되지 않은 시스템을 사용하게 될 것이라는 것입니다.아니요살아서 noclobber
당신을 구해줄 수 있다는 희망으로 잠재적으로 위험한 명령을 행복하게 실행하게 될 것입니다. 그러나 그렇지는 않습니다. 그런 다음 시스템이 먼저 확인을 요청할 것이라고 생각하기 때문에 손상된 데이터를 복구할 수 있을 만큼 최신 백업이 있기를 바랍니다.
답변3
noclobber
~/.bashrc
(for bash
) 또는 ~/.zshrc
(더 정확하게는 $ZDOTDIR/.zshrc
for ) 에서 셸 옵션을 설정하면 zsh
대화형 셸 세션에서 해당 옵션이 활성화됩니다.
비대화형 쉘(스크립트)은 이러한 파일을 읽지 않습니다.
쉘 옵션은 일반적으로 상위 쉘에서 상속되지 않습니다.
이는 스크립트가 명시적으로 이러한 파일을 제공하지 않는 한 기존 스크립트의 동작을 수정하지 않고도 이러한 파일에서 옵션을 설정할 수 있어야 함을 의미합니다.
내가 본 유일한 단점은 적어도 처음에는 옵션을 설정했다는 사실을 반복적으로 잊어버린다는 것입니다. 나중에 이러한 모든 유형의 작업과 마찬가지로 >|
실제로 파일을 손상시키고 싶지 않더라도 습관적으로 사용하기 시작합니다(예: 별칭을 지정 rm
하고 cp
Always mv
옵션을 설정한 사람이 -i
결국 -f
명령줄에서 Always를 사용하기 시작함).
답변4
명령에도 별칭을 추가하는 것이 좋습니다 rm
.
간단하게 만들기 위해 허용된 답변과 제안을 결합하고 있습니다.
# safe overwrite
set -o noclobber
alias cp='cp -i'
alias mv='mv -i'
alias really-rm="/bin/rm"
# safe remove
move_to_trash() {
local trash_dir
trash_dir="${HOME}/.trash"
if [ ! -d "${trash_dir}" ]; then
echo "Trash directory doesn't exist. Creating..."
mkdir "${trash_dir}"
echo "Created!"
fi
local new_dir_name
new_dir_name="${trash_dir}/$(date +%Y-%m-%d_%H-%M-%S)/"
mkdir "${new_dir_name}"
echo "Moving to: ${new_dir_name}"
mv "$@" ${new_dir_name}
echo 'Done!'
}
alias rm="move_to_trash"