Biorąc pod uwagę, że zsh
można zamknąć wszystkie pliki z poleceniem:
>*
Myślę, że ustawienie tej opcji noclobber
byłoby dobrym pomysłem.
Zawsze mogę użyć, >| file
jeśli chcę użyć domyślnego zachowania Clobber zarówno w bash, jak i zsh. (zsh pozwala również na alternatywną składnię >!file
).
Domyślam się, że nie noclobber
jest ustawiony domyślnie ze względu na zgodność z POSIX, ale dla pewności:
Czy są jakieś wady ustawienia noclobber
?
Czy w ogóle można ustawić noclobber
tylko dla interaktywnej powłoki?
rm *
...Odpowiedzi:
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
):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 celemrm
.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 powieszfile exists: foo
luboverwrite '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 powinnyalias 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.źródło
rm
ma opcję-I
, której używam i zalecam: „monituj raz przed usunięciem więcej niż trzech plików lub podczas usuwania rekurencyjnego; mniej uciążliwy niż-i
, jednocześnie zapewniając ochronę przed większością błędów”-i
jako domyślnego argumentu jest doskonałym pomysłem, ale powinno być stosowane pod różnymi nazwami aliasów , a nie z oryginałami (na przykład zawsze umieszczamalias copy="cp -i"
ialias move="mv -i"
w moim .bashrc). Dlaczego? Z powodu trybu awarii. Co dzieje się, gdy używasz komputera lub innego użytkownika, który nie ma aliasów cp / mv? Pliki potencjalnie nadpisane przypadkowo (być może nie wykryte!). Odpowiedni tryb awarii z aliasem kopiuj / przenieś: shell skarży się, że nie rozpoznaje polecenia.-i
argumentu dla cp i mv jest doskonałe, ale rada dotycząca ponownego użycia nazw cp i mv jest okropnie zła. Szkoda, że muszę oddać odpowiedź w głosowaniu. Proszę zmienić, aby używać różnych nazw aliasów, a ja oddam mu głos.alias RM='command rm'
, który kazałby zsh użyć zewnętrznego poleceniarm
zamiast aliasu. W ten sposób nie musisz polegać na--interactive=never
zastąpieniu poprzedniego-i
.Ustawienie
noclobber
opcji powłoki w~/.bashrc
(forbash
) lub~/.zshrc
(a dokładniej$ZDOTDIR/.zshrc
, forzsh
) spowoduje, że będzie ona aktywna w interaktywnych sesjach powłoki.Nieinteraktywne powłoki (skrypty) nie odczytują tych plików.
Opcje powłoki zwykle nie są dziedziczone z powłok macierzystych.
Oznacza to, że powinieneś być w stanie ustawić opcję w tych plikach bez zmiany zachowania w istniejących skryptach, chyba że skrypty jawnie je pobierają.
Jedynym minusem tego, co widzę, jest to, że wielokrotnie zapominasz, że ustawiłeś tę opcję, przynajmniej na początku. Później, ze wszystko to rodzaj rzeczy, można rozpocząć korzystanie z przyzwyczajenia
>|
, nawet w przypadkach, gdy w rzeczywistości nie chcą sprać plik (podobnie jak osoby z aliasyrm
,cp
amv
z-i
opcją zawsze ustawiony w końcu zacząć, aby zawsze używać-f
w wierszu poleceń).źródło
bash
, opcje są dziedziczone, jeśli$SHELLOPTS
($BASHOPTS
dlashopt
nich) jest w środowisku (nie coś można generalnie chcemy zrobić chociaż tego rodzaju przyczyny).Minusem jest to, że jeśli przyzwyczaisz się do bycia
noclobber
aktywnym, pewnego dnia użyjesz systemu, w którym nie jest on aktywny, i beztrosko wykonasz potencjalnie niebezpieczne polecenie, oczekując, żenoclobber
cię uratuje ... i nie zrobi tego. A potem będziesz mieć nadzieję, że istnieje wystarczająca kopia zapasowa, aby odzyskać zniszczone dane, ponieważ zakładasz, że najpierw zostaniesz poproszony o potwierdzenie.źródło