"noclobber"를 설정하면 단점이 있나요?

"noclobber"를 설정하면 단점이 있나요?

zsh주어진 명령으로 모든 파일을 삭제할 수 있다고 가정하면 :

>*

noclobber이 옵션을 설정하는 것이 좋다고 생각합니다 .

>| filebash 및 zsh에서 기본 파괴 동작을 사용하려면 언제든지 이를 사용할 수 있습니다. (zsh는 대체 구문도 허용합니다 >!file).

noclobberPOSIX 호환성 때문에 기본적으로 설정되어 있지는 않을 것 같지만 다음 사항을 확인하세요 .

설정에 단점이 있나요 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/.zshrcfor ) 에서 셸 옵션을 설정하면 zsh대화형 셸 세션에서 해당 옵션이 활성화됩니다.

비대화형 쉘(스크립트)은 이러한 파일을 읽지 않습니다.

쉘 옵션은 일반적으로 상위 쉘에서 상속되지 않습니다.

이는 스크립트가 명시적으로 이러한 파일을 제공하지 않는 한 기존 스크립트의 동작을 수정하지 않고도 이러한 파일에서 옵션을 설정할 수 있어야 함을 의미합니다.

내가 본 유일한 단점은 적어도 처음에는 옵션을 설정했다는 사실을 반복적으로 잊어버린다는 것입니다. 나중에 이러한 모든 유형의 작업과 마찬가지로 >|실제로 파일을 손상시키고 싶지 않더라도 습관적으로 사용하기 시작합니다(예: 별칭을 지정 rm하고 cpAlways 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"

관련 정보