Können Sie in Bash einen Nullbefehl als Alias für etwas verwenden? Mit anderen Worten: Erkennen, dass der Benutzer nur die EnterTaste an der Shell-Eingabeaufforderung gedrückt hat? Wenn Sie beispielsweise den Bildschirm mit einem leeren Shell-Eintrag löschen möchten, wie verwenden Sie dann den Alias Enterfür den clear
Befehl?
Antwort1
So können Sie einem leeren Befehl (effektiv) einen Alias zuweisen:
Tragen Sie Folgendes in Ihr ein .bashrc
:
command1()
{
if [ "$BASH_COMMAND" != command2 ]
then
command_flag=1
fi
return 0
}
trap command1 debug
command2()
{
if [ ! "$command_flag" ]
then
echo "clear" # Put whatever command(s) you want here.
fi
command_flag=
}
PROMPT_COMMAND=command2
command1
Ersetzen Sie und bei Bedarf command2
konsequent durch Wörter, die Sie nicht so leicht zufällig eingeben.
trap command1 debug
bewirkt, dass diecommand1
Funktion jedes Mal ausgeführt wird, wenn Sie (der Benutzer) einen Befehl eingeben.- Wenn der letzte auszuführende Befehl nicht war
command2
,command1
wird gesetztcommand_flag
.
- Wenn der letzte auszuführende Befehl nicht war
- Die Zuweisung führt
command2
dazu , dass es immer dann ausgeführtPROMPT_COMMAND
wirdcommand2
, wenn die Shell im Begriff ist, eine Eingabeaufforderung auszugeben.- Wenn
command_flag
der Wert nicht leer ist, bedeutet dies, dass escommand1
gerade ausgeführt wurde, d. h. der Benutzer hat gerade einen Befehl ausgeführt. Tun Sie in diesem Fall nichts. - Wenn
command_flag
nichteinen nicht leeren Wert haben, bedeutet dies, dass der Benutzer gerade gedrückt hat Enter. Tun Sie in diesem Fall, was Sie tun möchten (z. B. den Bildschirm löschen). - In beiden Fällen
command_flag
auf leer setzen, damit im nächsten Zyklus alles funktioniert.
- Wenn
Hinweis: Ich bin ziemlich sicher, dass dies bash-spezifisch ist (d. h. von POSIX nicht unterstützt wird).
Diese Antwort wurde im Wesentlichen aus meiner Antwort auf kopiertHinzufügen von vertikalem Abstand nach dem Befehl in Bash. Siehe auchsagen, ob der letzte Befehl in PROMPT_COMMAND leer war für andere Ansätze.
Antwort2
TL;DR: Ctrl-l
löscht den Bildschirm, ohne ein Zeichen zu drucken oder die Eingabetaste zu drücken. Dies kommt Ihrer gewünschten Funktionalität wahrscheinlich am nächsten. Sie können einen Befehl vor oder nach jedem Befehl ausführen lassen oder einen Alias für ein einzelnes Zeichen erstellen. Sie können der leeren Zeichenfolge keinen Alias zuweisen.
Aliase sind nicht unbedingt dafür gedacht, alles in einer Zeile einzugeben.
alias ll='ls -l'
ist ein gutes Beispiel dafür. Sie können es tun ll /path/to/other/dir
und Ergebnisse erzielen.
Ein Alias ändert lediglich das erste Wort, das in der Befehlszeile eingegeben wird, in den Wert, den Sie ihm zugewiesen haben.
Die einzige Voraussetzung für die Funktion eines Alias ist, dass ihm ein nicht druckbares Zeichen (Leerzeichen/Tabulator/Neue Zeile) folgen muss. In unserem Fall ll
ist allein gültig, aber ll-/mypath/
nicht, weil es möglich ist (und häufig gemacht wird), ein paar Zeichen mit einem Alias zu versehen, die den Anfang eines anderen Befehls bilden können (d. h. es alias gi='git init'
kann nur genau auflösen gi
, nicht git
, was die meisten Leute wollen und erwarten).
Es ist nicht möglich, der leeren Zeichenfolge etwas zuzuordnen, da dies am Anfang vonjedenBefehlszeilen-Eintrag.
Wenn Sie möchten, dass ein Befehl jedes Mal ausgeführt wird, können Sie PS0
(vorausgesetzt, die Version von Bash ist aktuell genug) vor jedem Befehl etwas ausführen oder PROMPT_COMMAND
nach jedem Befehl etwas ausführen. Beispiel:
PROMPT_COMMAND='echo $?'
würde den Rückgabewert des von Ihnen ausgeführten Befehls nach jedem ausgeführten Befehl wiedergeben.
Bash bietet keine gute Möglichkeit, eine Aktion abzuschließen, wenn und nur wenn Sie eine leere Zeile in die Befehlszeile eingegeben haben. Bash ist in dieser Hinsicht nicht auf Leerzeichen empfindlich.