Führen Sie einen anderen Befehl aus, bevor Sie den Befehl ausführen, den der Benutzer ausführen möchte

9

Angenommen, ich möchte das ursprüngliche Verhalten des lsTools folgendermaßen ändern :

$ ls
Hello World
file1 file2 ...

Wie kann ich das machen?

Beim Ausführen lsmöchte ich einen anderen Befehl ausführen, sagen wir echo "Hello World!".

Die schnelle Lösung, die ich sehe, ist die Verwendung von Alias:

alias orig_ls="ls"
alias ls='echo "Hello World!"'

Dies ist jedoch keine echte Lösung, da sie beim Ausführen orig_lsausgegeben wird "Hello World!".

Ionică Bizău
quelle
Fügen Sie ein weiteres ls in den eigenen Pfad des Benutzers ein und verwenden Sie dieses, um das Original zu verknüpfen.
Peter - Wiedereinstellung Monica

Antworten:

12

Manchmal ist ein Alias ​​nicht leistungsfähig genug, um einfach das zu tun, was Sie wollen. Hier ist ein Weg, ohne sie zu verwenden.

Fügen Sie in einer Datei, die beim Start Ihrer Shell bezogen wird (z. B. .bashrc), die folgende Funktion hinzu:

ls () {
    echo "Hello world!"
    command ls "$@"
}

Im Gegensatz zu einem Alias ​​kann eine Funktion wiederkehren. Deshalb command lswird statt verwendet ls; Es weist Ihre Shell an, die tatsächliche lsFunktion anstelle der gerade definierten Funktion zu verwenden.

U-Bahn
quelle
2
Tatsächlich. Diese Lösung lässt sich besser skalieren. +1
PythonNut
Was ist die commandAlternative für OS X?
Ionică Bizău
@ IonicăBizău Ich habe keine Ahnung, dass commandes nicht funktioniert hat: / Ich habe keine Ahnung und ich habe keinen Mac, mit dem ich es testen kann, sorry.
U-Bahn:
9

Sie dürfen nicht vergessen anzurufen ls:

alias ls='echo "Hello World!"; ls'
Hauke ​​Laging
quelle
Ha! Ich nahm an, dass dies einen unendlichen Kreislauf schaffen wird! Aber warum entsteht keine Endlosschleife?
Ionică Bizău
1
Sie können stattdessen das Echo von alias ls "Hello World!" Versuchen. / usr / bin / ls '
Jamesqf
5
@ IonicăBizău Eine bestimmte "Alias-Erweiterungsregel" wird nur einmal verwendet.
David Z
Würde es funktionieren, die beiden mit einem & zu verbinden? Das würde auch sicherstellen, dass der Befehl des Benutzers nur ausgeführt wird, wenn der benutzerdefinierte funktioniert, oder?
Fund Monica Klage
@QPaysTaxes Sie können &zwar verwenden, aber ich verstehe das Argument, das Sie daraus machen, nicht.
Hauke ​​Laging