Czy można cofnąć polecenie w powłoce bash?

12

Zastanawiałem się, czy istnieje (prosta) możliwość powtórzenia / cofnięcia polecenia wykonanego w powłoce bash? (aby go cofnąć)

Czy istnieje coś podobnego do kombinacji ctrl+, zaby powtórzyć dowolną akcję (na przykład w słowie lub LibreOffice)?

Fraenzina
źródło
8
krótka odpowiedź to nie. niektóre polecenia mogą zostać cofnięte, ale nie ma czegoś takiego jak ogólne cofnięcie.
Archemar
3
jak powiedzieli inni, żadne undopolecenie, więc posiadanie aktualnej kopii zapasowej całego systemu operacyjnego jest naprawdę przydatne. Gdy coś pójdzie nie tak, przywracasz poprzedni stan. Spójrz na przykład rsnapshot
Arkadiusz Drabczyk
1
Chciałbym znaleźć sposób na cofnięcie polecenia zatrzymania -p
Skaperen
3
@Joshua Publikowanie komentarza za pomocą polecenia, które może zniszczyć dane użytkownika, a żadne wyjaśnienie nie jest akceptowalnym zachowaniem. To nie jest śmieszne, zaśmieca stronę i, co najważniejsze, jest niebezpieczne. Nie rób tego ponownie.
terdon
2
Chciałbym cofnąć shutdownpolecenie lol .. Nie mogę uwierzyć, że takie pytania mogą uzyskać 8 głosów poparcia w ciągu dnia !!
MagExt,

Odpowiedzi:

33

Powinieneś zrozumieć, że bashto 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 mvjest łatwo odwracalny, po prostu przenosząc plik z powrotem do miejsca, z którego pochodzi, chyba że coś nadpisałeś. Dlatego -iistnieje przełącznik, aby zapytać Cię przed zastąpieniem. Technicznie rzecz biorąc, odwrotnie cpjest rm, chyba że coś zostało nadpisane (ponownie -ipyta o to). rmjest 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ń). rmoznacza rm, że jeśli chcesz mieć funkcję „kosza”, to właściwie jest to po prostumvdo jakiegoś wcześniej ustalonego katalogu (i ewentualnie zaplanowanej usługi w celu jego utrzymania lub opróżnienia) - nic specjalnego. Ale możesz użyć, -iaby wyświetlić monit przed usunięciem. Możesz użyć funkcji lub aliasu, aby zawsze dołączać -ido 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 lsjest 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). chrootlub lxcmoż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 echopolecenia, które zostaną wykonane. Następnie, jeśli polecenia wyglądają rozsądnie, usuń echoi 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 -lrtpomaga 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.

orion
źródło
14

Nie, nie ma czegoś takiego jak „cofnij” w Bash, przepraszam. Dlatego powinieneś dokładnie sprawdzić swoje polecenia lub przetestować je najpierw na nieistotnych plikach (jeśli to możliwe). I potrójnie sprawdź, czy robisz rzeczy jako root;)

Erathiel
źródło
1
Ctr + / wykonuje cofanie niektórych poleceń Control w terminalu bash, ale nie wszystkie polecenia można cofnąć.
Eric Leschinski,
@EricLeschinski Czy możesz podać jakieś referencje?
Erathiel,
Jest zakopany w odpowiedziach na komentarze na tej stronie: skorks.com/2009/09/bash-shortcuts-for-maximum-productivity Aby zobaczyć, jak działa, wpisz kilka słów na terminalu. Przesuń kursor w lewo nad znakiem, naciśnij Ctrl-d, aby usunąć pod znakiem, a następnie naciśnij Ctrl + /, który cofnie usunięcie.
Eric Leschinski
1
Och, ale to coś zupełnie innego niż cofnięcie polecenia. Jeśli usuniesz plik za pomocą rm, plik zniknie, zniknie, nie żyje, już nie jest, to plik ex (alert Monty Python). Teraz jego krewni płaczą ze smutku i nie możecie cofnąć swego czynu. To, o czym mówisz, to cofanie pisania lub usuwanie znaków i podejrzewam, że jest to funkcja emulatora terminala. Właśnie wypróbowałem to w Terminatorze i działa. Przełączenie na inną konsolę (w moim przypadku Ctrl + Alt + F1) nie pozwala na to.
Erathiel
Istnieje polecenie cofnięcia polecenia terminala i polecenie cofnięcia po wykonaniu polecenia terminalu. Przybyłem tutaj, szukając tego pierwszego.
Eric Leschinski
11

Nie, nie ma ogólnego cofnięcia, ale niektóre konsekwencje są bardziej odwracalne niż inne. Weźmy na przykład rm: jest zasadniczo używany do dwóch celów - uniknięcia bałaganu i zwolnienia miejsca na nowe pliki. Przy odrobinie szczęścia możesz odzyskać zawartość pliku za pomocą narzędzi takich jak extundelete, ponieważ tylko wskaźnik do początku pliku jest zastępowany po uruchomieniu rm; zawartość jest nadpisywane, gdy system operacyjny ponowne wykorzystanie tej przestrzeni (co może się zdarzyć milisekund lub lat później). Ze względu na tę funkcjonalność rmmieści się w środku skali systemów mniej lub bardziej destrukcyjnych. Z jednej strony są śmiecisystemy, które pozwalają uniknąć bałaganu bez ryzyka natychmiastowej utraty danych (ponieważ cofanie jest banalne). Jeszcze bardziej konserwatywne są zapisywanie raz, odczytywanie wielu systemów („WORM”), w których dane nie mogą zostać usunięte ani nadpisane przez system zapisujący do nich. Na drugim końcu skali znajdują się systemy niszczenia , które oprócz wskaźnika nadpisują zawartość pliku (zwykle wiele razy). W tym momencie technologia odzyskiwania danych prawdopodobnie jeszcze nie istnieje (a być może nigdy nie będzie istnieć).

Możesz więc zobaczyć, w jaki sposób konkretne narzędzie najczęściej używane ( rm) nie jest jedyną alternatywą, ale zapewnia kompromis, z którym większość ludzi wydaje się czuć komfortowo:

  • Usunięcie wskaźnika pliku jest bardzo szybkie i w bardzo niewielkim stopniu przyczynia się do pogorszenia dysku
  • Mniej prawdopodobne jest, że zabraknie Ci miejsca w wysoce zautomatyzowanych systemach
  • Zapewnia bardzo skromną, ale niezerową ochronę prywatności, i odwrotnie, gwarancje odzyskiwania
  • Niska złożoność, a zatem niska szansa na błędy lub nieoczekiwane zachowanie

Jeśli kompromisy dokonywane przez twoje narzędzia są dla Ciebie nie do przyjęcia, rozejrzyj się. Są szanse, że istnieją narzędzia, które podejmują odpowiednie dla Ciebie decyzje .

l0b0
źródło
3
Jedyną częścią tej odpowiedzi, która dotyczy tego pytania, jest pierwsza linia
Alvaro
Próbuję tylko wyjaśnić, dlaczego tak jest, z perspektywy sysadmin.
l0b0
9

Aplikacje, które zapewniają funkcję „cofnij”, robią to, utrzymując historię podjętych działań i albo metodę cofania akcji, albo migawkę stanu obiektu w celu przywrócenia poprzedniego stanu. Polecenia wykonywane w powłoce wykonują akcje bezpośrednie lub wykonują polecenia w celu wykonania akcji.

Sama powłoka nie miałaby możliwości cofnięcia działań wynikających z dowolnego polecenia lub programu, który został uruchomiony. Jeśli polecenie lub program utrzymywał historię i miał funkcję cofania, być może można by jej użyć, ale sama powłoka nie może.

Na przykład, jeśli uruchomisz rm important_file.txt, poinformuje to sterownik systemu plików o „odłączeniu” pliku w systemie plików. Powłoka nie wykonuje akcji, wywołuje tylko to, rmco robi.

W przypadku chęci przywrócenia utraconego pliku może to być możliwe, ponieważ zazwyczaj usunięcie pliku w rzeczywistości go nie usuwa, a jedynie usuwa odniesienie do niego. Po pewnym czasie zawartość pliku zostanie nadpisana w miarę zapisywania innych danych na dysku, ale przez pewien czas oryginalny plik można przywrócić za pomocą narzędzi, które mogą go znaleźć i „ponownie połączyć”.

wraeth
źródło
1

Nie, nie ma, ale jeśli powiesz, że popełniłeś błąd z uprzywilejowanym katalogiem głównym i jakoś coś spieprzyłeś, najlepszym rozwiązaniem jest zapisanie wszystkich plików na dysku USB lub karcie SD i zresetowanie systemu operacyjnego z plik ISO (jeśli nadal go masz, jeśli nie, możesz przejść do trybu offline ...). Jeśli coś usunąłeś, możesz, jak powiedział Wraeth , pobrać aplikację, aby ponownie połączyć dane pliku z nazwą pliku i zapisać zawartość pliku (zobacz to pytanie tutaj ). Aby uzyskać bardziej szczegółową odpowiedź, czy możesz nam powiedzieć, co zrobiłeś źle?

Ciekawy...
źródło
1

Nie powtórzę tego, co powiedzieli inni, ale widzę, skąd przybywasz. Moje standardowe podejście do wykonywania „niebezpiecznych” poleceń zawsze polegało na ich powtarzaniu w celu sprawdzenia, czy wszystkie zmienne są odpowiednio rozwinięte, czy nie. Jeśli możesz podać kilka konkretnych przypadków, możemy pomóc.

Na przykład w sytuacji takiej jak:

for i in $(cat /my/file); 
do 
   echo "Now removing file $i using rm -f $i"
done
Hopping Bunny
źródło
1

Podobnie jak inne dobre odpowiedzi: w powłoce nie ma „cofnięcia”. Ale w konkretnym przypadku użycia, aby cofnąć shutdown, możesz zabić proces zamykania: patrz /programming//a/526330

Olivier Dulac
źródło