Powinieneś zrozumieć, że bash
to tylko środowisko wykonywania. Wykonuje polecenia, które wywołujesz - nie jest zadaniem powłoki, aby nawet wiedzieć, co robi polecenie, możesz wywołać dowolny plik wykonywalny, jaki chcesz. W większości przypadków nawet nie jest jasne, co zrobiłoby cofnięcie - na przykład czy możesz „odegrać” film? Czy możesz „wysłać” e-mail? Co oznaczałoby na przykład „cofnięcie uruchomienia firefoxa”? Możesz go zamknąć, ale zakładki, pliki do pobrania i historia nie będą takie same.
Jeśli uruchomisz polecenie, zostanie ono wykonane bez względu na to, co zrobi. Od Ciebie zależy, czy wiesz, co robisz. Zauważ, że nie oznacza to, że poszczególne polecenia nie mają „cofnięcia” ... mogą - możesz nawet napisać funkcję otoki, która zrobi coś, co ochroni cię przed głupimi błędami.
Na przykład mv
jest łatwo odwracalny, po prostu przenosząc plik z powrotem do miejsca, z którego pochodzi, chyba że coś nadpisałeś. Dlatego -i
istnieje przełącznik, aby zapytać Cię przed zastąpieniem. Technicznie rzecz biorąc, odwrotnie cp
jest rm
, chyba że coś zostało nadpisane (ponownie -i
pyta o to). rm
jest bardziej trwały, aby spróbować odzyskać pliki, musisz faktycznie hakować na niższym poziomie (istnieją na to narzędzia). Jeśli uważasz, że system plików jest czarną skrzynką, technicznie nie byłby w ogóle możliwy (tylko szczegóły logicznego i fizycznego układu danych pozwalają na pewną kontrolę uszkodzeń). rm
oznacza rm
, że jeśli chcesz mieć funkcję „kosza”, to właściwie jest to po prostumv
do jakiegoś wcześniej ustalonego katalogu (i ewentualnie zaplanowanej usługi w celu jego utrzymania lub opróżnienia) - nic specjalnego. Ale możesz użyć, -i
aby wyświetlić monit przed usunięciem. Możesz użyć funkcji lub aliasu, aby zawsze dołączać -i
do tych poleceń.
Pamiętaj, że większość aplikacji chroni Cię przed utratą danych na różne sposoby. Większość (~ wszystkich) edytorów tekstu tworzy ~
na końcu pliki kopii zapasowych na wypadek, gdybyś chciał przywrócić starą wersję. W niektórych dystrybucjach ls
jest domyślnie aliasowany, więc ukrywa je ( -B
), ale tam są. Dużą ochronę zapewnia odpowiednie zarządzanie uprawnieniami: nie należy rootować, chyba że trzeba, ustaw pliki tylko do odczytu, jeśli nie chcesz, aby się zmieniały. Czasami warto mieć środowisko „piaskownicy” - uruchamiasz rzeczy na kopii, sprawdzasz, czy wszystko jest w porządku, a następnie scalasz zmiany (lub rezygnujesz ze zmian). chroot
lub lxc
może uniemożliwić twoim skryptom ucieczkę z katalogu i wyrządzenie szkody.
Kiedy próbujesz wykonywać rzeczy zbiorczo - na przykład, jeśli masz skomplikowane polecenie find, pętla, długi potok lub coś w tym rodzaju, dobrym pomysłem jest, aby najpierw wykonać tylko echo
polecenia, które zostaną wykonane. Następnie, jeśli polecenia wyglądają rozsądnie, usuń echo
i uruchom je na prawdę. I oczywiście, jeśli naprawdę nie jesteś pewien, co robisz, najpierw wykonaj kopię. Czasami po prostu tworzę archiwum bieżącego katalogu.
Mówiąc o tarballach - tarbomb i zipbomb są dość powszechne niestety (kiedy ludzie tworzą archiwum bez odpowiedniego podkatalogu, a rozpakowywanie rozprasza pliki, robiąc wielki bałagan). Przyzwyczaiłem się do samodzielnego tworzenia podkatalogu przed rozpakowaniem ( mogłem wyświetlić zawartość, ale jestem leniwy). Zastanawiam się nad stworzeniem skryptu, który utworzy podkatalog tylko wtedy, gdy zawartość zostanie zarchiwizowana bez podkatalogu. Ale kiedy to się dzieje, ls -lrt
pomaga znaleźć najnowsze pliki, aby umieścić je tam, gdzie należą. Podałem to tylko jako przykład - program może wywoływać wiele skutków ubocznych, o których powłoka nie może wiedzieć (Jak to możliwe? Wywoływanie innego programu!) Jedynym pewnym sposobem uniknięcia błędów jest ostrożność (pomyśl dwa razy, uruchom raz).
Prawdopodobnie najbardziej niebezpiecznymi poleceniami są te, które dotyczą systemu plików: mkfs, fdisk / gdisk i tak dalej. Mogą całkowicie zniszczyć system plików (chociaż przy odpowiednim oprogramowaniu kryminalistycznym możliwa jest przynajmniej częściowa inżynieria wsteczna). Zawsze sprawdź dokładnie formatowane urządzenie, a partycjonowanie jest prawidłowe, przed uruchomieniem polecenia.