Um zu verhindern, dass "gefährliche" Befehle im Bash-Verlauf protokolliert werden, habe ich meiner .bashrc
Datei folgende Zeile hinzugefügt :
HISTIGNORE='rm *:mv *:cp *:cat*>*:pv*>*'
Das funktioniert gut, hat aber einen Nebeneffekt: Ich kann den vollständigen Verlauf der auf einem Computer ausgeführten Befehle nicht sehen. Angenommen, ich habe mehrere Maschinen für Experimente und möchte alle ausgeführten Befehle sehen können. Ich würde die interne Bash verwenden history
, um ausgeführte Befehle anzuzeigen und vielleicht nach dem heutigen Datum zu fragen:
history | grep Sep-28
Was ich tun möchte, ist, auch "gefährliche" Befehle zu protokollieren, aber ein #
an den Anfang der Zeile zu setzen, so dass, wenn ich den Befehl aus der Vergangenheit versehentlich ausführen würde, kein Schaden angerichtet würde.
Ich habe keine Ahnung, ob dies möglich ist.
Update und Klarstellung:
Der Hauptgrund, warum dies für mich ein Problem ist, ist, dass ich normalerweise von mehreren Terminals aus mit meinem Computer verbunden bin und jeder Befehl, der auf einem Terminal ausgeführt wird, sofort in die Historie anderer Terminals eingelesen wird. Dies wird erreicht durch
PROMPT_COMMAND="history -a; history -c; history -r"
Stellen wir uns vor, ich habe zwei Terminals geöffnet. In einem habe ich welchecat /dev/foo > file.out
laufenden Prozess. Im zweiten überprüfe ich den Fortschritt mit ls -lAhF
. Ich halte Wiederholung ls
durch Drücken Upund ENTER(die, letzter Befehl aus der Geschichte ist). Sobald der erste Befehl beendet ist, ist der letzte Befehl aus dem Verlauf nicht mehr vorhanden ls
, aber cat /dev/foo > file.out
. Wenn ich nicht aufpasse, starte ich cat erneut und überschreibe file.out.
Was ich erreichen möchte, ist, dass dem cat-Befehl ein vorangestellt wird #
, damit er nicht ausgeführt wird. Ich würde es jedoch immer noch in der Geschichte sehen und kann es wiederverwenden (wenn es ein langer Befehl ist), indem ich es nicht kommentiere.
quelle
watch ls -lAhF
oder verwendenwhile sleep 1; do ls -lAhf; done
. Anstatt die Dateigröße zu beobachten, können Siepv /dev/foo > file.out
( ivarch.com/programs/pv.shtml ) verwenden.Antworten:
Sie könnten etwas tun wie:
Die Idee ist, dass wir vor jeder Eingabeaufforderung den letzten Verlaufseintrag überprüfen (
history 1
) und, wenn es einer der gefährlichen ist, ihn löschen (history -d
) und ihn mit einem#
mit wieder hinzufügenhistory -s
.(Natürlich müssen Sie Ihre entfernen
HISTIGNORE
Einstellung ).Ein unerwünschter Nebeneffekt davon ist jedoch, dass es die Geschichtszeit von jenen verändert
rm
,mv
... Befehle .Um das zu beheben, könnte eine Alternative sein:
Dieses Mal zeichnen wir die Zeit des letzten Verlaufs auf, und um die Verlaufszeile wieder hinzuzufügen, verwenden wir
history -r
eine temporäre Datei (das Dokument hier), die den Zeitstempel enthält.Sie möchten
fixhist
, dass das Lied vor Ihrem aufgeführt wirdhistory -a; history -c; history -r
. Leider hat die aktuelle Version vonbash
einen Fehler,history -a
der die zusätzliche Zeile, die wir hinzugefügt haben , nicht speichert. Eine Abhilfe besteht darin, es stattdessen zu schreiben:Das heißt, wir fügen den kommentierten Befehl an die HISTFILE an, anstatt ihn ausführen zu lassen
history -a
.quelle
cmd=${cmd#*[0-9] }
tut? Und wo genau soll ichfixhist
meine einfügenPROMPT_COMMAND
? Im Moment enthält es bereitsPROMPT_COMMAND="history -a; history -c; history -r"
HISTTIMEFORMAT=/
? Ich habe bereits festgelegtexport HISTTIMEFORMAT="%b-%d %H:%M "
. Übrigens$HOME/.bashrc
passiert nichts , wenn ich Ihren Code zu meinem hinzufüge .HISTTIMEFORMAT=/
ist nur für diesen einen Aufruf vonhistory
, um eine Ausgabe wie zu erhalten,123 /rm x
in der es einfacher ist, das cmd zu extrahieren. Es gab ein Problem mit einigen Versionen vonbash
wo$HISTCMD
war unecht in diesem Zusammenhang versucht die neue Version.#
im Code nicht als Kommentar fungiert.bashrc
?bash
ein*
nach der nicht erwarteten Verlaufsnummer ein. Sollte jetzt behoben sein.Ich werde Ihre Frage nicht genau beantworten, Ihnen aber möglicherweise eine alternative Lösung für Ihr Problem anbieten.
Wenn ich richtig verstehe, sind Sie besorgt über Fehler, die Sie durch Tippen machen könnten, zB
!rm
wenn es passiert ist, dass der vorherigerm
Befehl im Verlauf etwas entfernt, das Sie behalten möchten.In diesem Fall ist eine nette Bash- Option
histverify
. Wenn Sieshopt -s histverify
und wenn Sie einen Befehl mit dem Knall zurückrufen!
, wird er nicht sofort ausgeführt, sondern in die Readline geladen, sodass Sie entscheiden können ihn ausführen möchten oder nicht. Auf diese Weise haben Sie auch die Möglichkeit, ihn zu bearbeiten.Versuch es:
ohne
histverify
:Mit
histverify
:In diesem Fall befindet sich der Cursor am Ende der Zeile und kann erneut gestartet oder bearbeitet werden.
Wenn Ihnen diese Option gefällt, geben Sie sie in Folgendes ein
.bashrc
:quelle