Kann ich für die leere Zeichenfolge einen Alias ​​verwenden?

Kann ich für die leere Zeichenfolge einen Alias ​​verwenden?

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 Enter​​für den clearBefehl?

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

command1Ersetzen Sie und bei Bedarf command2konsequent durch Wörter, die Sie nicht so leicht zufällig eingeben.

  • trap command1 debugbewirkt, dass die command1Funktion jedes Mal ausgeführt wird, wenn Sie (der Benutzer) einen Befehl eingeben.
    • Wenn der letzte auszuführende Befehl nicht war command2, command1wird gesetzt command_flag.
  • Die Zuweisung führt command2dazu , dass es immer dann ausgeführt PROMPT_COMMAND wird command2, wenn die Shell im Begriff ist, eine Eingabeaufforderung auszugeben.
    • Wenn command_flagder Wert nicht leer ist, bedeutet dies, dass es command1gerade ausgeführt wurde, d. h. der Benutzer hat gerade einen Befehl ausgeführt. Tun Sie in diesem Fall nichts.
    • Wenncommand_flagnichteinen 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_flagauf leer setzen, damit im nächsten Zyklus alles funktioniert.

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-llö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/dirund 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 llist 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_COMMANDnach 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.

verwandte Informationen