Manchmal verstehe ich die Syntax eines Befehls falsch:
# mysql -d test
mysql: unknown option '-d'
# echo $?
2
Ich versuche es noch einmal und mache es richtig:
# mysql --database test
Welcome to the MySQL monitor.
mysql >
...
Wie verhindere ich, dass der erste Befehl mit einem anderen Fehlercode als 0 den Verlauf eingibt?
bash
command-history
Adam Matan
quelle
quelle
Die einzige Möglichkeit, dies zu tun, wäre die Verwendung
history -d
in$PROMPT_COMMAND
. Das Problem bei diesem oder einem anderen Ansatz ist, dass nicht erkennbar ist, ob ein Befehl mit einem Fehler beendet oder mit einem Exit-Code ungleich Null erfolgreich abgeschlossen wurde.quelle
Es ist gut, den letzten falschen Kommentar zu haben, um ihn zu korrigieren, aber kurz danach wird es möglicherweise zu einem verwirrenden Müll.
Mein Ansatz besteht aus zwei Schritten: Speichern Sie fehlgeschlagene Befehle und entfernen Sie sie später.
Speichern Sie Befehle, bei denen ein Fehler auftritt:
trap command signals
wird ausgeführt,command
wenn einer vonsignals
"ausgelöst" wird.$(command)
, führt das auscommand
und erfasst seine Ausgabe.Wenn der Befehl fehlschlägt, erfasst dieses Codefragment die Verlaufsnummer des zuletzt im Verlauf gespeicherten Befehls und speichert sie in einer Variablen zum späteren Löschen.
Einfach, funktioniert aber nicht richtig mit
HISTCONTROL
undHISTIGNORE
- Wenn der Befehl aufgrund einer der Variablen nicht im Verlauf gespeichert wird, ist die Verlaufsnummer des zuletzt im Verlauf gespeicherten Befehls die Nummer des vorherigen Befehls. Wenn also ein falscher Befehl nicht im Verlauf gespeichert wird, wird der vorherige Befehl gelöscht.Etwas kompliziertere Version, die in diesem Fall korrekt funktioniert:
Gespeicherte Befehle später entfernen:
Erläuterung:
Entfernen Sie beim Verlassen von Bash für jede eindeutige Verlaufsnummer den entsprechenden Verlaufseintrag. Deaktivieren Sie
dann das Kontrollkästchen,
FAILED_COMMANDS
um keine Befehle zu entfernen, die Verlaufsnummern von bereits gelöschten Befehlen übernommen haben.Wenn Sie sicher sind, dass
FAILED_COMMANDS
keine Duplikate vorhanden sind, können Sie einfach darüber iterieren(dh schreiben
for i in $FAILED_COMMANDS
). Wenn Sie jedoch erwarten, dass es nicht vom größten zum kleinsten sortiert wird (in diesem Fall immer), ersetzen Sie esuniq
durchsort -rnu
.Verlaufsnummern in
FAILED_COMMANDS
müssen eindeutig sein und vom größten zum kleinsten sortiert werden, da beim Löschen von Einträgen die Nummern der nächsten Befehle verschoben werden - d. H. Wenn Sie ausstellenhistory -d 2
, wird der dritte Eintrag zum zweiten, der vierte zum dritten usw.Aus diesem Grund können Sie bei Verwendung dieses Codes nicht manuell anrufen,
history -d <n>
wo
n
eine kleinere oder gleich große gespeicherte Nummer vorhanden ist,FAILED_COMMANDS
und erwarten, dass der Code ordnungsgemäß funktioniert.
Es ist wahrscheinlich eine gute Idee , Haken
exit_handler
anEXIT
, aber man kann es auch früher jederzeit anrufen.quelle