Alias-Erweiterung für Watch-Befehl

67

Wenn Sie den watchBefehl ausführen, der einen Alias ​​enthält, wird der Alias ​​nicht erweitert. Ich habe es sowohl mit einfachen als auch mit doppelten Anführungszeichen versucht, und zwar mit dem folgenden Alias:

# alias ll
alias ll='ls -l --color=tty'

Der folgende Befehl schlägt fehl

# watch ll
sh: ll: command not found

Sollte die Befehlszeilenerweiterung in diesem Fall nicht funktionieren?

ztank1013
quelle

Antworten:

98

Aliase werden nur als erstes Argument oder nach einem anderen Alias ​​mit einem Leerzeichen am Ende des Befehls erweitert.

Von bash's help alias:

Ein nachfolgendes Leerzeichen in VALUE bewirkt, dass das nächste Wort auf Alias-Ersetzung überprüft wird, wenn der Alias ​​erweitert wird.

Versuchen Sie dazu Folgendes:

alias watch='watch '
alias ll='ls -l --color=tty'
watch ll

Bedenken Sie, dass einige Versionen von watchStreifenfarben standardmäßig aktiviert sind. Bei einigen Versionen kann dies durch Verwendung von --coloroder gestoppt werden -G.

Chris Down
quelle
1
Das ist eine absolut großartige Antwort! Danke und natürlich +1.
ztank1013 25.11.11
1
Vielen Dank ... Während dieser ganzen Zeit habe ich 1. ll eingegeben, 2. STRG + ALT + E gedrückt, 3. dann watch vorangestellt. Das spart Zeit.
Anishsane
10
Leider gibt es bei dieser Methode eine Einschränkung, für die Sie keine Optionen angeben können, watchda der Alias ​​das nächste Wort sein watchmuss und die Argumente vor dem Befehl benötigt werden, um ausgeführt zu werden. Wenn Sie es versucht haben watch -n 10 <alias>, wird der Alias ​​durch Bash nicht erweitert. Um dies zu umgehen, benötigen Sie einen Alias, der die gewünschten Optionen enthält (z. B. `alias watch-10 = 'watch -n 10'), jedoch mit einem Leerzeichen am Ende.
indiv
2

Vielleicht könnten wir den Alias ​​manuell erweitern, bevor watch ihn sieht?

watch $(alias ll | cut -d\' -f2)

Erläuterung

Die Ausgabe von alias llsieht so aus:

$ alias ll
alias ll='ls -lAGh'

Also setzen wir den Delimeter des Schnitts auf einfaches Anführungszeichen und schneiden das 2. Feld aus.

ls -lAGh

dh der erweiterte Alias. Das bildet dann die Argumente, denen gegeben wird watch.

Machen Sie eine Funktion, um es zu tun

function watcha {
    watch $(alias "$@" | cut -d\' -f2)
}

Dann,

watcha ll

funktioniert wie gewünscht. Das ist schrecklich und wird in allen möglichen Situationen scheitern. Es tut uns leid.

Jonathan Hartley
quelle
0

Ich dachte, hier ist das Grundproblem beim Ausführen watch, das Argument wird an " sh -c" übergeben, was bedeutet, wenn llin der sh(dash shell's)Umgebung kein Alias definiert ist, wird es nicht erweitert. Aber ich habe mich geirrt und das ist nicht der Fall, Chris 'Antwort oben ist richtig.

Sachin Divekar
quelle
2
Nicht genau. Versuchen Sie es watch 'alias ll="ls -l --color=tty"; type ll; ll'.
Chris Down
+1 für sofortige Antwort zur Bestätigung. Ich habe mich oben geirrt.
Sachin Divekar
@ChrisDown, auch wenn " sh -c" watch " " verwendet, gilt dies auch für Ihre Erklärung sh. Habe ich recht?
Sachin Divekar
1
Das hängt davon ab, als welche Shell verwendet wird sh. Beachten Sie, dass dies funktioniert :sh -c $'alias ll="ls -l --color=tty"\ntype ll\nll'
Chris Down
0

Habe watcheine neue interaktive Shell gestartet, die den Alias ​​erweitern wird:

watch -x bash -i -c ll

(Das -xsoll verhindern, watchdass es sh -czum Umbrechen des angegebenen Befehls verwendet wird. Wir wollen das nicht, weil wir -ian shoder übergeben bashmüssen, um daraus eine interaktive Shell zu machen, die .bashrc liest und Aliase definiert. Mit -xführt watch das aus Befehl mit exec.)

Gah, eigentlich funktioniert das nicht. Nachdem die Ausgabe von 'll' einmal angezeigt wurde und dann 2 Sekunden lang geschlafen wurde, wird der Job im Hintergrund ausgeführt. Dabei ist Folgendes zu beachten:

1]+  Stopped                 watch -x bash -i -c ll

Warum hat es aufgehört? Wo ist die offene Zahnspange geblieben [? Verdammt, ich dachte das wäre eine großartige Antwort, aber ich kann es nicht zum Laufen bringen.

Jonathan Hartley
quelle