Ist es möglich, einen Befehl in der Bash-Shell umzukehren?


12

Ich habe mich gefragt, ob es eine (einfache) Möglichkeit gibt, einen in der Bash-Shell ausgeführten Befehl zu wiederholen / rückgängig zu machen. (um es rückgängig zu machen)

Gibt es etwas Ähnliches wie die Kombination ctrl+ z, um eine Aktion zu wiederholen (zum Beispiel in Word oder LibreOffice)?


8
kurze antwort ist nein. Einige Befehle könnten zurückgesetzt werden, aber es gibt kein generisches Rückgängigmachen.
Archemar

3
Wie bereits erwähnt, ist kein undoBefehl hilfreich, um ein aktuelles Backup des gesamten Betriebssystems zu erstellen. Wenn etwas schief geht, stellen Sie einfach den vorherigen Zustand wieder her. Schauen Sie sich zum Beispiel rsnapshot an
Arkadiusz Drabczyk

1
Ich möchte einen Weg finden, den Befehl halt -p rückgängig zu machen
Skaperen

3
@Joshua Das Posten eines Kommentars mit einem Befehl, der die Daten eines Benutzers zerstören kann und keine Erklärung enthält, ist kein akzeptables Verhalten. Es ist nicht lustig, es verstopft die Website und vor allem ist es gefährlich. Mach das nicht wieder.
Terdon

2
Ich würde gerne den shutdownBefehl rückgängig machen lol .. kann nicht glauben, dass solche Fragen auch 8 Upvotes an einem Tag bekommen können !!
MagExt

Antworten:


33

Sie sollten verstehen, dass dies bashnur eine Ausführungsumgebung ist. Es führt Befehle aus, die Sie aufrufen - es ist nicht Sache der Shell, auch nur zu wissen, was der Befehl tut, sondern Sie können jede beliebige ausführbare Datei aufrufen, die Sie möchten. In den meisten Fällen ist nicht einmal klar, was ein Rückgängigmachen bewirken würde - können Sie beispielsweise einen Film "unplayen"? Können Sie eine E-Mail "abschicken"? Was würde "Firefox rückgängig machen" zum Beispiel bedeuten? Sie können es schließen, aber Lesezeichen, Downloads und Verlauf stimmen nicht überein.

Wenn Sie einen Befehl ausführen, wird er ausgeführt, unabhängig davon, was er tut. Es liegt an Ihnen zu wissen, was Sie tun. Beachten Sie, dass dies nicht bedeutet, dass einzelne Befehle nicht rückgängig gemacht werden können. Sie können sogar eine Wrapper-Funktion schreiben, die Sie vor dummen Fehlern schützt.

Zum Beispiel mvist es einfach umzukehren, indem Sie die Datei einfach dorthin verschieben, wo sie herkommt, es sei denn, Sie haben etwas überschrieben. Deshalb gibt es einen -iSchalter, um Sie vor dem Überschreiben zu fragen. Technisch Inverse von cpist rm, es sei denn , etwas überschrieben wurde (wieder -ifragt man darüber). rmist dauerhafter, um zu versuchen, die Dateien wieder zu bekommen, müssen Sie tatsächlich ein bisschen Hacking auf niedrigerer Ebene durchführen (es gibt Tools dafür). Wenn Sie das Dateisystem als Black-Box betrachten, wäre es technisch überhaupt nicht möglich (nur die Details des logischen und physischen Layouts der Daten ermöglichen eine gewisse Schadensbegrenzung). rmDas heißt rm, wenn Sie "Müll" -Funktionalität wollen, ist das eigentlich nurmvin ein vorab festgelegtes Verzeichnis (und möglicherweise einen geplanten Dienst, um es zu pflegen oder zu leeren) - nichts Besonderes. Sie können jedoch dazu verwenden -i, Sie vor dem Löschen aufzufordern. Sie können eine Funktion oder einen Alias ​​verwenden, um -idiese Befehle immer einzuschließen.

Beachten Sie, dass die meisten Anwendungen Sie auf unterschiedliche Weise vor Datenverlust schützen. Die meisten (~ alle) Texteditoren erstellen ~am Ende Sicherungsdateien, falls Sie die alte Version wiederherstellen möchten. In einigen Distributionen lsist der Alias ​​standardmäßig so eingestellt, dass sie ausgeblendet werden ( -B), aber sie sind vorhanden. Ein Großteil des Schutzes wird durch die ordnungsgemäße Verwaltung von Berechtigungen gewährleistet: Seien Sie nicht root, es sei denn, Sie müssen es sein. Machen Sie Dateien schreibgeschützt, wenn Sie nicht möchten, dass sie geändert werden. Manchmal ist es nützlich, eine "Sandbox" -Umgebung zu haben - Sie führen Dinge auf einer Kopie aus, prüfen, ob es in Ordnung ist, und führen die Änderungen dann zusammen (oder verwerfen sie). chrootoder lxckann verhindern, dass Ihre Skripte aus einem Verzeichnis entkommen und Schaden anrichten.

Wenn Sie versuchen, Dinge in großen Mengen auszuführen - zum Beispiel, wenn Sie einen komplexen Suchbefehl, eine while-Schleife, eine lange Pipeline oder ähnliches haben, ist es eine gute Idee, zuerst nur echodie Befehle auszuführen, die ausgeführt werden. Wenn die Befehle dann vernünftig aussehen, entfernen Sie sie echound führen Sie sie real aus. Und natürlich, wenn Sie sich nicht sicher sind, was Sie tun, machen Sie zuerst eine Kopie. Manchmal erstelle ich einfach ein Tarball des aktuellen Verzeichnisses.

Apropos Tarballs - Tarbombs und Zipbombs sind leider weit verbreitet (wenn Leute ein Archiv ohne richtiges Unterverzeichnis erstellen und beim Entpacken die Dateien verstreut werden, entsteht ein riesiges Durcheinander). Ich habe mich daran gewöhnt, vor dem Auspacken selbst ein Unterverzeichnis anzulegen (ich könnte den Inhalt auflisten, bin aber faul). Ich denke darüber nach, ein Skript zu erstellen, das nur dann ein Unterverzeichnis erstellt, wenn der Inhalt ohne Unterverzeichnis archiviert wurde. Aber wenn es passiert, ls -lrthilft es, die neuesten Dateien zu finden, um sie dort abzulegen, wo sie hingehören. Ich habe dies nur als Beispiel angeführt - ein Programm kann viele Nebenwirkungen haben, von denen die Shell nichts zu wissen vermag (wie könnte es sein? Es wird ein anderes Programm aufgerufen!) zweimal laufen).

Möglicherweise sind die gefährlichsten Befehle diejenigen, die sich mit dem Dateisystem befassen: mkfs, fdisk / gdisk und so weiter. Sie können das Dateisystem vollständig zerstören (obwohl mit geeigneter forensischer Software zumindest ein teilweises Reverse Engineering möglich ist). Überprüfen Sie immer das zu formatierende Gerät und die korrekte Partitionierung, bevor Sie den Befehl ausführen.


14

Nein, es gibt kein "Rückgängigmachen" in Bash, sorry. Aus diesem Grund sollten Sie Ihre Befehle überprüfen oder sie zuerst an unwichtigen Dateien testen (sofern dies möglich ist). Und dreifach überprüfen, ob Sie Dinge als root tun;)


1
Strg + / macht bestimmte Steuerbefehle im Bash-Terminal rückgängig, aber nicht alle Befehle können rückgängig gemacht werden.
Eric Leschinski

@EricLeschinski Können Sie eine Referenz angeben?
Erathiel

Es ist in den Antwortkommentaren dieser Seite vergraben : skorks.com/2009/09/bash-shortcuts-for-maximum-productivity Um zu sehen, ob es funktioniert, geben Sie ein paar Worte in das Terminal ein. Bewegen Sie den Cursor nach links über ein Zeichen, drücken Sie Strg-d, um es unter dem Zeichen zu löschen, und drücken Sie dann Strg + /, um das Löschen rückgängig zu machen.
Eric Leschinski

1
Oh, aber das ist etwas grundlegend anderes, als einen Befehl rückgängig zu machen. Wenn Sie eine Datei mit entfernen rm, ist die Datei weg, sie ist vergangen, sie ist verstorben, sie ist nicht mehr vorhanden, sie ist eine Ex-Datei (Monty Python-Warnung). Jetzt weinen seine Verwandten in Trauer, und Sie können Ihre Tat nicht rückgängig machen. Sie machen die Eingabe oder das Löschen von Zeichen rückgängig, und ich vermute, dass dies eine Funktion Ihres Terminal-Emulators ist. Ich habe es gerade in Terminator ausprobiert und es funktioniert. Das Wechseln zu einer anderen Konsole (in meinem Fall Strg + Alt + F1) funktioniert nicht.
Erathiel

Es gibt Terminalbefehlseingabe rückgängig machen und Terminalbefehl nach Ausführung rückgängig machen. Ich bin auf der Suche nach dem ersteren hergekommen.
Eric Leschinski

11

Nein, es gibt kein generisches Rückgängigmachen, aber einige Konsequenzen sind reversibler als andere. Nehmen wir zum Beispiel rm: Es wird im Wesentlichen zu zwei Zwecken verwendet - um Unordnung zu vermeiden und Speicherplatz für neue Dateien freizugeben. Mit etwas Glück können Sie den Inhalt der Datei mit Tools wie abrufen extundelete, da beim Ausführen nur der Zeiger auf den Dateianfang überschrieben wird rm. Der Inhalt wird überschrieben, wenn das Betriebssystem diesen Speicherplatz erneut verwendet (was Millisekunden oder Jahre später passieren kann). Aufgrund dieser Funktionalität rmfällt in die Mitte einer Skala von Systemen, die mehr oder weniger destruktiv sind. Einerseits gibt es MüllSysteme, mit denen Unordnung vermieden werden kann, ohne dass die Gefahr besteht, dass die Daten sofort verloren gehen (da das Rückgängigmachen trivial ist). Noch konservativer ist es , einmal zu schreiben, viele ("WORM") Systeme zu lesen , bei denen die Daten nicht nach Belieben gelöscht oder überschrieben werden können, indem das System darauf schreibt. Am anderen Ende der Skala wird Zerkleinerungssysteme, die Überschreibungsdatei Inhalt ( in der Regel mehrmals) zusätzlich zu dem Zeiger. Zu diesem Zeitpunkt ist die Technologie zum Wiederherstellen Ihrer Daten wahrscheinlich noch nicht einmal vorhanden (und möglicherweise nie vorhanden).

Sie können also sehen, dass das am häufigsten verwendete Tool ( rm) nicht die einzige Alternative ist, aber es bietet einen Kompromiss, mit dem sich die meisten Leute wohl fühlen:

  • Das Löschen eines Dateizeigers ist sehr schnell und trägt kaum zur Verschlechterung der Festplatte bei
  • Es ist weniger wahrscheinlich, dass Ihnen auf Systemen, die stark automatisiert sind, der Speicherplatz ausgeht
  • Bietet sehr bescheidene Datenschutzgarantien, die jedoch nicht Null sind, und garantiert umgekehrt die Wiederherstellung
  • Geringe Komplexität und daher geringe Wahrscheinlichkeit von Fehlern oder unerwartetem Verhalten

Wenn die Kompromisse, die Ihre Werkzeuge eingehen, für Sie inakzeptabel sind, schauen Sie sich um. Die Chancen sind , gibt es Tools gibt , die die Entscheidungen treffen , die das Richtige für sind Sie .


3
Der einzige Teil dieser Antwort, der die Frage beantwortet, ist die erste Zeile
Alvaro

Ich versuche nur zu erklären, warum die Dinge so sind, aus der Perspektive eines Systemadministrators.
l0b0

9

Anwendungen, die eine Funktion zum Rückgängigmachen bereitstellen, führen dazu einen Verlauf der durchgeführten Aktionen und entweder eine Methode zum Umkehren der Aktion oder eine Momentaufnahme des Status eines Objekts, um einen vorherigen Status wiederherzustellen. Befehle, die in einer Shell ausgeführt werden, führen direkte Aktionen aus oder führen Befehle aus, um Aktionen auszuführen.

Die Shell selbst wäre nicht in der Lage, die aus einem ausgeführten Befehl oder Programm resultierenden Aktionen rückgängig zu machen. Wenn der Befehl oder das Programm eine Historie unterhält und eine Undo-Funktion hat, könnte dies möglicherweise verwendet werden, aber die Shell selbst kann dies nicht.

Wenn Sie beispielsweise ausführen rm important_file.txt, wird der Dateisystemtreiber angewiesen, die Verknüpfung der Datei im Dateisystem aufzuheben. Die Shell führt die Aktion nicht aus, sondern ruft nur auf, rmwas der Fall ist.

Wenn Sie eine verlorene Datei wiederherstellen möchten, können Sie dies möglicherweise tun, da das Löschen der Datei in der Regel diese nicht tatsächlich entfernt, sondern nur den Verweis darauf entfernt. Nach einiger Zeit wird der Inhalt der Datei überschrieben, wenn andere Daten auf der Festplatte gespeichert werden. Die ursprüngliche Datei kann jedoch für eine Weile mithilfe von Dienstprogrammen wiederhergestellt werden, die sie finden und erneut verknüpfen können.


1

Nein, das gibt es nicht, aber wenn Sie beispielsweise mit einem Verzeichnis mit Root-Rechten herumgespielt und etwas vermasselt haben, ist es am besten, alle Dateien, die Sie können, auf einem USB-Laufwerk oder einer SD-Karte zu speichern und Ihr Betriebssystem von dort zurückzusetzen die ISO-Datei (wenn Sie sie noch haben, wenn nicht, können Sie eine andere offline schalten ...). Wenn Sie etwas gelöscht Sie können, wie wraeth sagte, eine Anwendung herunterladen , die Dateidaten an den Dateinamen erneut zu verknüpfen und die Dateien haben Inhalte gespeichert (siehe diese Frage hier ). Können Sie uns für eine genauere Antwort sagen, was Sie falsch gemacht haben?


1

Ich werde nicht wiederholen, was andere gesagt haben, aber ich kann sehen, woher Sie kommen. Mein Standardansatz bei der Ausführung "gefährlicher" Befehle war immer, sie zu wiederholen, um zu prüfen, ob alle Variablen richtig erweitert wurden oder nicht. Wenn Sie bestimmte Beispiele nennen können, können wir Ihnen möglicherweise weiterhelfen.

Zum Beispiel in einer Situation wie:

for i in $(cat /my/file); 
do 
   echo "Now removing file $i using rm -f $i"
done

1

Wie andere gute Antworten sagten: Es gibt kein "Rückgängigmachen" in der Shell. In Ihrem speziellen Anwendungsfall können Sie zum Rückgängigmachen eines shutdownVorgangs das Herunterfahren abbrechen: siehe /programming//a/526330

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.