`noclobber` 설정의 단점이 있습니까?


20

주어진 zsh명령으로 모든 파일을 클로버 할 수 있습니다.

>*

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

>| filebash와 zsh에서 기본 클로버 동작을 사용하려면 항상 사용할 수 있습니다 . (zsh는 대체 구문을 허용합니다 >!file).

나는 같은데요 noclobber때문에 POSIX 호환성 기본적으로 설정 해제되어 있지만, 단지 확인하기 위해 :

설정에 단점이 noclobber있습니까?

noclobber대화식 쉘에 대해서만 설정 해야합니까?


3
나는 놀랄 zsh을 적어도이 같은 것에 대해 경고 않음을 주어, 그것에 대해 경고하지 않습니다 해요 rm *...
ilkkachu

답변:


24

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의해서만 읽 힙니다. 물론 스크립트에 영향을 줄 수있는 방식으로 쉘 옵션을 변경해서는 안됩니다. 스크립트를 손상시킬 수 있기 때문입니다.


6
rm옵션을 가지고 -I내가 사용하는 것이 좋습니다 : "프롬프트 번 개 이상의 파일을 제거하거나 반복적으로 제거 할 때 이전; 이하 침해 -i, 여전히 대부분의 실수에 대한 보호 기능을 제공하면서"
리드

9
그런 식으로 cp 및 mv를 다시 앨리어싱 하지 않는 것이 좋습니다 . 그러나 사용하여 -i그들에게 기본 인자로하는 것은 좋은 생각이지만, 그것을 적용해야 다른 별명 이름 이 아닌 원본은 (예를 들어 나는 항상 넣어 alias copy="cp -i"alias move="mv -i"내 .bashrc에에). 왜? 실패 모드로 인해. cp / mv 별칭이없는 컴퓨터 또는 다른 사용자를 사용하면 어떻게됩니까? 파일이 의도하지 않게 덮어 써질 수 있습니다 (아마도 감지되지 않았습니다!). 별명 복사 / 이동 : 해당 쉘이 명령을 인식하지 못한다고 불평합니다.
hlovdal

1
cp / mv 별명에 대한 추가 실패 모드도 있습니다. 쉘 스크립트를 작성할 때 cp = "cp -i"별명에 사용되는 누군가가 cp 명령이 대화 형 모드 에서처럼 작동하지 않을 것으로 예상하는 cp 명령을 잘못 작성할 수 있습니다. 이름 차이. 반대로, "일부 파일 / 일부 / 어디 복사"를 작성할 때마다 cp 명령이 아닌 별명을 사용한다는 것을 알고 있습니다. 그리고 쉘 파일에 사본을 넣어야하더라도 별칭이 누락 된 쉘과 동일한 방식으로 실패합니다.
hlovdal

1
따라서 TL; DR -icp 및 mv에 대한 인수 를 사용하도록 기본 설정하는 조언 은 훌륭하지만 cp 및 mv 이름을 재사용하는 조언은 끔찍합니다. 답을 다운 투표해야한다는 것은 나쁘다. 다른 별칭 이름을 사용하도록 변경하면 투표권이 부여됩니다.
hlovdal

1
@TomHale alias RM='command rm'을 사용하면 zsh가 rm별명 대신 외부 명령을 사용하도록 지시 할 수 있습니다 . 그렇게 --interactive=never하면 이전 을 대체 할 필요가 없습니다 -i.
Adaephon

6

설정 noclobber에서 쉘 옵션을 ~/.bashrc(위해 bash) 또는 ~/.zshrc(또는 더 정확하게 $ZDOTDIR/.zshrc, 대한 것은 zsh) 대화 형 쉘 세션에서 활성화됩니다.

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

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

이는 스크립트가 명시 적으로 해당 파일을 소스하지 않는 한 기존 스크립트의 동작을 수정하지 않고 해당 파일에서 옵션을 설정할 수 있음을 의미합니다.

내가 볼 수있는 유일한 단점은 적어도 처음에는 옵션을 설정했다는 것을 반복해서 잊어 버린다는 것입니다. 그 후, 모든 사물의 이러한 종류의, 당신은 습관적으로 사용을 시작합니다 >|심지어 당신이 실제로 단지에 대한 별칭을 가진 사람과 같은 파일을 (소지품하지 않을 수 있습니다 경우에 rm, cp그리고 mv-i옵션이 항상 설정, 결국 항상 사용하기 시작 -f명령 행에서).


2
bash하는 경우, 옵션은 상속 $SHELLOPTS( $BASHOPTS에 대한 shopt것), 환경 (당신은 이성의 이런 종류 불구하고 싶지 일반적으로 것없는 무엇인가)에 있습니다.
Stéphane Chazelas

3

단점은 noclobber, 당신이 활동에 익숙해지면 언젠가는 시스템이 작동 하지 않는 시스템을 사용 하고 잠재적으로 위험한 명령을 실행하여 noclobber당신을 구할 것을 기대하고 ... 그렇지 않을 것이라는 점입니다. 그런 다음 먼저 확인을 요청한다고 가정하여 파괴 한 데이터를 복구하기위한 충분한 백업이 있기를 바랍니다.


물론 언젠가는 활성화되지 않은 시스템을 사용하게됩니다. 익숙하지 않은 시스템을 사용하는 경우 출력을 파일로 리디렉션하는 것과 같이 잠재적으로 파괴적인 작업을 수행하기 전에 백업을 최신 상태로 유지해야합니다.
Gilles 'SO- 악마 그만해'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.