J'essaie de comprendre comment ajouter de nouveaux indicateurs d'exécution aux commandes exécutées à partir du terminal.
Pour par exemple. : J'ai récemment commencé à expérimenter avec Docker et je trouve fastidieux de nettoyer les conteneurs sortis en les copiant en les collant. Je veux ajouter une option de ligne de commande clean
au runtime docker
de sorte que, lorsque je lance docker clean
(ou peut-être docker --clean
si nous allons dans cette direction), je peux mappez-le en interne pour exécuter une commande de nettoyage avec des options déjà prises en charge par le docker runtime (à savoir docker rm $(docker ps -a -q -f status=exited)
) Est-il possible d'établir un tel mappage?
Je sais qu’une option consiste à utiliser des alias, mais les alias ne permettent pas d’avoir des indicateurs d’espaces/de ligne de commande dans les noms d’alias, à ma connaissance. De même, les fonctions du shell n’aident pas, car elles remplacent toute la fonctionnalité (ou peut-être que je me trompe). Je voulais explorer cette possibilité depuis un moment, donc toute aide sera appréciée.
Vous pouvez définir une fonction bash portant le même nom qu'un exécutable et lui demander de traiter votre paramètre supplémentaire et d'appeler la fonction d'origine sans ambiguïté à l'aide de la commande intégrée command
. De 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.
Pour illustrer,
function ls() {
case "$1" in
"foo") shift
echo "do new thing with remaining args: $@"
;;
*) command ls "$@"
;;
esac
}
Ensuite
$ 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
fonctionne normalement, alors que
$ ls foo -ltr --color=always
do new thing with remaining args: -ltr --color=always
(vous aurez peut-être besoin de unalias
la commande ls
pour pouvoir essayer ceci).
De toute évidence, une implémentation dans le monde réel devrait effectuer une vérification d'erreur appropriée - peut-être en utilisant getopts
pour traiter la ligne de commande complète plutôt qu'un simple commutateur/cas sur $1
.
Alternativement (et plus traditionnellement), vous pouvez obtenir le même résultat en écrivant un script wrapper et en le plaçant quelque part plus tôt dans votre $PATH
que l'exécutable d'origine (tel que /usr/local/bin
ou $HOME/bin
). Dans l'encapsuleur, faites référence à l'exécutable d'origine par son chemin absolu.