Czy są jakieś wady ustawienia „noclobber”?

20

Biorąc pod uwagę, że zshmożna zamknąć wszystkie pliki z poleceniem:

>*

Myślę, że ustawienie tej opcji noclobberbyłoby dobrym pomysłem.

Zawsze mogę użyć, >| filejeś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 noclobberjest 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ć noclobbertylko dla interaktywnej powłoki?

Tom Hale
źródło
3
Dziwi mnie, że zsh przynajmniej tego nie ostrzega, biorąc pod uwagę, że ostrzega przed czymś takim jak rm *...
ilkkachu

Odpowiedzi:

24

Przyczyną noclobbernie 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”. noclobberJest 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 ( .bashrclub .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 -ina tej liście, ponieważ usunięcie danych jest głównym celem rm.

Należy pamiętać, że noclobberi -isiatki 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: foolub 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, ygdy 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.

noclobberzostanie ustawiony tylko dla interaktywnych powłok, ponieważ .bashrclub .zshrcjest 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.

Gilles „SO- przestań być zły”
źródło
6
rmma 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”
Reid
9
Gorąco polecam nie re-aliasing cp i mv tamtędy. Jednak użycie ich -ijako 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 umieszczam alias copy="cp -i"i alias 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.
hlovdal
1
Istnieje również dodatkowy tryb awarii dla aliasu cp / mv: podczas pisania skryptu powłoki ktoś, kto jest używany do aliasu cp = "cp -i", może napisać komendę cp niepoprawnie oczekującą, że zachowa się jak w trybie interaktywnym, ponieważ nie ma różnica nazw. Natomiast za każdym razem, gdy piszę „kopiuj gdzieś / gdzieś / gdzie” wiem, że używam aliasu, a nie polecenia cp bezpośrednio. I nawet gdybym umieścił kopię w pliku powłoki, nie udałoby się to tak samo, jak w przypadku powłoki z brakującym aliasem.
hlovdal
1
Tak więc TL; DR zalecenie, aby domyślnie używać -iargumentu 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.
hlovdal
1
@TomHale Możesz użyć alias RM='command rm', który kazałby zsh użyć zewnętrznego polecenia rmzamiast aliasu. W ten sposób nie musisz polegać na --interactive=neverzastąpieniu poprzedniego -i.
Adaephon,
6

Ustawienie noclobberopcji powłoki w ~/.bashrc(for bash) lub ~/.zshrc(a dokładniej $ZDOTDIR/.zshrc, for zsh) 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 aliasy rm, cpa mvz -iopcją zawsze ustawiony w końcu zacząć, aby zawsze używać -fw wierszu poleceń).

Kusalananda
źródło
2
Z bash, opcje są dziedziczone, jeśli $SHELLOPTS( $BASHOPTSdla shoptnich) jest w środowisku (nie coś można generalnie chcemy zrobić chociaż tego rodzaju przyczyny).
Stéphane Chazelas
3

Minusem jest to, że jeśli przyzwyczaisz się do bycia noclobberaktywnym, pewnego dnia użyjesz systemu, w którym nie jest on aktywny, i beztrosko wykonasz potencjalnie niebezpieczne polecenie, oczekując, że noclobbercię 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.

Dave Sherohman
źródło
Pewnie, pewnego dnia użyjesz systemu, w którym nie jest aktywny. Korzystając z nieznanego systemu, należy zachować szczególną ostrożność i upewnić się, że kopie zapasowe są aktualne, zanim zrobi się coś potencjalnie destrukcyjnego, np. Przekieruje dane wyjściowe do pliku.
Gilles „SO- przestań być zły”