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

3

Estou tentando descobrir como adicionar novos sinalizadores de tempo de execução a comandos que são executados a partir do terminal.

Por exemplo. : Recentemente, comecei a experimentar o Docker e achei tedioso limpar contêineres retirados copiando IDs. Eu quero adicionar uma opção de linha de comando clean ao docker runtime, para que quando eu executar docker clean (ou talvez docker --clean se formos dessa forma) eu possa mapear 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 um mapeamento desse tipo?

Sei que uma opção é usar aliases, no entanto aliases não permitem ter espaços / sinalizadores de linha de comando nos nomes de alias, ao melhor de meu conhecimento. Da mesma forma, as funções do shell não ajudam, porque substituem toda a funcionalidade (ou talvez eu esteja fazendo errado). Eu queria explorar essa possibilidade por um tempo, então qualquer ajuda será apreciada.

    
por fwx 18.09.2016 / 12:45

1 resposta

4

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 sem ambiguidade usando o command builtin. 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.

Para 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 comando unalias the ls para tentar fazer isso).

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

Como alternativa (e mais tradicional), você pode conseguir o mesmo escrevendo um script de wrapper e colocando-o em algum lugar anterior ao seu $PATH do que o executável original (como /usr/local/bin ou% código%). Dentro do wrapper, consulte o executável original por seu caminho absoluto.

    
por steeldriver 19.09.2016 / 01:23