Adicionando novos sinalizadores/opções de tempo de execução aos comandos no terminal?

Adicionando novos sinalizadores/opções de tempo de execução aos comandos no terminal?

Estou tentando descobrir como adicionar novos sinalizadores de tempo de execução aos comandos executados no terminal.

Por exemplo. : Recentemente, comecei a experimentar o Docker e acho entediante limpar contêineres existentes copiando e colando IDs. Quero adicionar uma opção de linha de comando cleanao dockertempo de execução, para que quando eu executar docker clean(ou talvez docker --cleanse formos nessa direção) eu possa mapeá-lo internamente para executar um comando de limpeza com opções já suportadas pelo tempo de execução do docker (ou seja docker rm $(docker ps -a -q -f status=exited)) é possível estabelecer tal mapeamento?

Eu sei que uma opção é usar aliases, no entanto, os aliases não permitem espaços/sinalizadores de linha de comando nos nomes de alias, até onde eu saiba. Da mesma forma, as funções do shell não ajudam porque substituem toda a funcionalidade (ou talvez eu esteja fazendo errado). Há algum tempo que queria explorar esta possibilidade, por isso qualquer ajuda será apreciada.

Responder1

Você pode definir uma função bash com o mesmo nome de um executável e fazer com que ela processe seu parâmetro adicional e chame a função original de forma inequívoca usando o commandarquivo interno. 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.

Ilustrar,

function ls() { 
  case "$1" in 
    "foo")  shift
            echo "do new thing with remaining args: $@" 
            ;; 
    *)      command ls "$@"
            ;;
  esac
}

Então

$ 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

funciona normalmente, enquanto

$ ls foo -ltr --color=always
do new thing with remaining args: -ltr --color=always

(você pode precisar do unaliascomando lspara tentar fazer isso).

Obviamente, uma implementação do mundo real deve fazer a verificação de erros adequada - talvez usando getoptspara processar toda a linha de comando, em vez de um simples switch/case on $1.


Alternativamente (e mais tradicionalmente), você poderia conseguir o mesmo escrevendo umscript de wrappere colocá-lo em algum lugar anterior $PATHao executável original (como /usr/local/binou $HOME/bin). Dentro do wrapper, consulte o executável original pelo seu caminho absoluto.

informação relacionada