web-dev-qa-db-fra.com

Ajout de nouveaux indicateurs / options d'exécution aux commandes du terminal?

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.

3
fwx

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.

4
steeldriver