Neue Laufzeitflags/Optionen zu Befehlen im Terminal hinzufügen?

Neue Laufzeitflags/Optionen zu Befehlen im Terminal hinzufügen?

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 cleander dockerLaufzeit eine Befehlszeilenoption hinzufügen, sodass ich sie beim Ausführen docker clean(oder vielleicht, docker --cleanwenn 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 commandintegrierten 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 unaliasden Befehl).ls

Natürlich sollte eine Implementierung in der Praxis eine ordnungsgemäße Fehlerprüfung durchführen – vielleicht indem getoptsdie 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 $PATHvor der ursprünglichen ausführbaren Datei steht (z. B. /usr/local/binoder $HOME/bin). Verweisen Sie innerhalb des Wrappers über den absoluten Pfad auf die ursprüngliche ausführbare Datei.

verwandte Informationen