Gibt es in bash innerhalb von PROMPT_COMMAND eine Möglichkeit, festzustellen, ob der Benutzer nur die Eingabetaste gedrückt und keinen Befehl eingegeben hat?
Überprüfen Sie, ob die Verlaufsnummer erhöht wurde. Eine abgebrochene Eingabeaufforderung oder eine Eingabeaufforderung, bei der der Benutzer gerade gedrückt hatEnter , erhöht die Verlaufsnummer nicht.
Die Verlaufsnummer ist in der Variablen verfügbar HISTCMD
, diese ist jedoch in nicht verfügbar PROMPT_COMMAND
(da Sie tatsächlich die Verlaufsnummer des vorherigen Befehls wünschen; der Befehl, der sich PROMPT_COMMAND
selbst ausführt , hat keine Verlaufsnummer). Sie können die Nummer aus der Ausgabe von erhalten fc
.
prompt_command () {
HISTCMD_previous=$(fc -l -1); HISTCMD_previous=${HISTCMD_previous%%$'[\t ]'*}
if [[ -z $HISTCMD_before_last ]]; then
# initial prompt
elif [[ $HISTCMD_before_last = "$HISTCMD_previous" ]]; then
# cancelled prompt
else
# a command was run
fi
HISTCMD_before_last=$HISTCMD_previous
}
PROMPT_COMMAND='prompt_command'
Beachten Sie, dass, wenn Sie das Quetschen von Duplikaten im Verlauf ( HISTCONTROL=ignoredups
oder HISTCONTROL=erasedups
) aktiviert haben , fälschlicherweise ein leerer Befehl gemeldet wird, nachdem zwei identische Befehle nacheinander ausgeführt wurden.
${HISTCMD_previous%%$'[\t ]'*}
fehlte das Bit$'…'
und wurde nach`,
t` oder Leerzeichen anstatt nach Tabulator oder Leerzeichen abgeschnitten, aber Bash druckt einen Tabulator.Es gibt eine Problemumgehung, die jedoch einige Anforderungen erfüllt:
Sie müssen festlegen
$HISTCONTROL
, dass ALLE Befehle sowie Duplikate und Leerzeichen gespeichert werden. Also setzen Sie:Definieren Sie nun eine aufzurufende Funktion als
$PROMPT_COMMAND
:Stellen Sie nun die
$PROMPT_COMMAND
Variable ein:Siehe die Ausgabe:
quelle
last
bleibt von einem Aufrufisnewline
zum nächsten erhalten (wählen Sie nur einen weniger generischen Namenprompt_command__isnewline__last
, um Konflikte zu vermeiden).HISTCONTROL="" function last_was_blank { local last_command="$(history 1)" if [[ "$last_was_blank_PREVIOUS_LINE" = "$last_command" ]] ; then echo "true" else echo "false" fi export last_was_blank_PREVIOUS_LINE="$last_command" } PROMPT_COMMAND=last_was_blank
Ich kenne per se keinen Weg, das zu tun . Mit können Sie jedoch den gleichen Effekt erzielen
Dadurch wird der
some_command_or_function
jedes Mal aufgerufen, wenn Sie einen Befehl ausführen. Das Knifflige ist, dass es nicht aufgerufen wird, wenn Sie nur Enterdrücken - es sei denn, Sie haben ein PROMPT_COMMAND definiert. In diesem Fall Enterruft das Schlagen das PROMPT_COMMAND auf, was wiederum die Falle auslöst.Der einfachste Weg, um das gewünschte Ergebnis zu erzielen, besteht darin, eine Debug-Trap-Funktion zu definieren, anstatt PROMPT_COMMAND zu verwenden. Aber ich kann es nicht sagen, weil ich nicht weiß, welches Ergebnis Sie wollen. Wenn Sie möchten, dass etwas passiert, wenn Sie nur drücken Enter, und etwas anderes / zusätzliches passiert, wenn Sie einen Befehl eingeben, müssen Sie (AFAIK) einen Debug-Trap und ein PROMPT_COMMAND verwenden. In dieser Antwort finden Sie eine Möglichkeit, die beiden Mechanismen gut zusammenspielen zu lassen.
quelle
(Dies wäre ein Kommentar zu der akzeptierten Antwort gewesen, wenn ich Kommentare hätte hinzufügen dürfen ...) @schlimmen, Sie können
HISTTIMEFORMAT
etwas wie einstellenHISTTIMEFORMAT='%F %T '
und dann speichern und vergleichenhistory 1
. Dies liegt daran, dass bei Löschvorgängen mindestens der Zeitstempel des (möglicherweise wiederholten) letzten Befehls jedes Mal geändert wird - und beiHISSTIMEFORMAT
entsprechender Einstellunghistory 1
der Zeitstempel (im Gegensatz zufc
) angezeigt wird und sich daher auch zwischen den wiederholten Befehlen unterscheidet.quelle