
Ich versuche herauszufinden, wie man Befehlen, die vom Terminal ausgeführt werden, neue Laufzeitflags hinzufügt.
Zum Beispiel: Ich habe vor Kurzem angefangen, mit Docker zu experimentieren und finde es mühsam, beendete Container durch Kopieren und Einfügen von IDs zu bereinigen. Ich möchte clean
der docker
Laufzeit eine Befehlszeilenoption hinzufügen, sodass ich sie beim Ausführen docker clean
(oder vielleicht, docker --clean
wenn wir diesen Weg gehen) intern zuordnen kann, um einen Bereinigungsbefehl mit bereits von der Docker-Laufzeit unterstützten Optionen auszuführen (nämlich docker rm $(docker ps -a -q -f status=exited)
). Ist es möglich, eine solche Zuordnung einzurichten?
Ich weiß, dass eine Möglichkeit darin besteht, Aliase zu verwenden, aber meines Wissens nach sind in Aliasnamen keine Leerzeichen/Befehlszeilenflags zulässig. Ebenso helfen Shell-Funktionen nicht, da sie die gesamte Funktionalität überschreiben (oder vielleicht mache ich es falsch). Ich wollte diese Möglichkeit schon seit einiger Zeit erkunden, daher bin ich für jede Hilfe dankbar.
Antwort1
Sie können eine Bash-Funktion mit demselben Namen wie eine ausführbare Datei definieren und sie Ihre zusätzlichen Parameter verarbeiten lassen und die ursprüngliche Funktion mithilfe des command
integrierten Befehls eindeutig aufrufen. Von man bash
:
command [-pVv] command [arg ...]
Run command with args suppressing the normal shell function
lookup. Only builtin commands or commands found in the PATH are
executed.
Um zu veranschaulichen,
function ls() {
case "$1" in
"foo") shift
echo "do new thing with remaining args: $@"
;;
*) command ls "$@"
;;
esac
}
Dann
$ ls -ltr --color=always
total 12
drwxrwxr-x 2 steeldriver steeldriver 4096 Sep 17 08:16 subdir1
drwxrwxr-x 2 steeldriver steeldriver 4096 Sep 17 08:17 subdir2
drwxrwxr-x 2 steeldriver steeldriver 4096 Sep 17 08:17 subdir3
funktioniert wie gewohnt, während
$ ls foo -ltr --color=always
do new thing with remaining args: -ltr --color=always
( Um dies auszuprobieren, benötigen Sie möglicherweise unalias
den Befehl).ls
Natürlich sollte eine Implementierung in der Praxis eine ordnungsgemäße Fehlerprüfung durchführen – vielleicht indem getopts
die gesamte Befehlszeile verarbeitet wird und nicht nur ein einfacher Switch/Case-Eintrag $1
.
Alternativ (und traditioneller) können Sie dasselbe erreichen, indem Sie Folgendes schreiben:Wrapper-Skriptund platzieren Sie es an einer Stelle, die in Ihrem $PATH
vor der ursprünglichen ausführbaren Datei steht (z. B. /usr/local/bin
oder $HOME/bin
). Verweisen Sie innerhalb des Wrappers über den absoluten Pfad auf die ursprüngliche ausführbare Datei.