Przyczyną noclobber
nie jest domyślnie tradycja. W związku z projektem interfejsu użytkownika dobrym pomysłem jest uczynienie „tworzenia tego nowego pliku” łatwą akcją, a dodatkowo utrudnianie bardziej niebezpiecznej akcji „albo stwórz nowy plik, albo zastąp istniejący plik”. noclobber
Jest to zatem dobry pomysł ( >
aby utworzyć nowy plik, >|
potencjalnie nadpisać istniejący plik) i prawdopodobnie byłby domyślny, gdyby powłoka została zaprojektowana kilkadziesiąt lat później.
Zdecydowanie zalecam użycie następujących elementów w interaktywnym pliku startowym powłoki ( .bashrc
lub .zshrc
):
set -o noclobber
alias cp='cp -i'
alias mv='mv -i'
W każdym przypadku (przekierowanie, kopiowanie, przenoszenie) celem jest dodanie dodatkowej przeszkody, gdy operacja może mieć efekt uboczny usunięcia niektórych istniejących danych, nawet jeśli usunięcie istniejących danych nie jest głównym celem operacji. Nie umieszczam rm -i
na tej liście, ponieważ usunięcie danych jest głównym celem rm
.
Należy pamiętać, że noclobber
i -i
są siatki bezpieczeństwa . Jeśli zadziałają, zrobiłeś coś złego . Więc nie używaj ich jako wymówki, aby nie sprawdzać, co zastępujesz! Chodzi o to, że powinieneś był sprawdzić, czy plik wyjściowy nie istnieje. Jeśli powiesz file exists: foo
lub overwrite 'foo'?
, oznacza to, że popełniłeś błąd i powinieneś czuć się źle i być bardziej ostrożnym. W szczególności nie przyzwyczajaj się do mówienia, y
gdy pojawi się monit o zastąpienie (prawdopodobnie aliasy powinny alias cp='yes n | cp -i' mv='yes n | mv -i'
, ale naciśnięcie Ctrl+ Cpoprawia wygląd danych wyjściowych): jeśli chciałeś zastąpić, anuluj polecenie, przenieś lub usuń dane wyjściowe plik i ponownie uruchom komendę.
Ważne jest również, aby nie przyzwyczaić się do wyzwalania tych zabezpieczeń, ponieważ jeśli to zrobisz, pewnego dnia będziesz na komputerze, który nie ma twojej konfiguracji i stracisz dane, ponieważ zabezpieczenia, na które liczyłeś, nie są tam.
noclobber
zostanie ustawiony tylko dla interaktywnych powłok, ponieważ .bashrc
lub .zshrc
jest odczytywany tylko przez interaktywne powłoki. Oczywiście nie powinieneś zmieniać opcji powłoki w sposób, który wpływałby na skrypty, ponieważ mogłoby to spowodować ich uszkodzenie.
rm *
...