Crie aliases dinamicamente

2

Eu quero criar aliases com base em um comando, seus subcomandos e suas opções. Eu gostaria que o alias fosse o acrônimo desses componentes.

Isso é mais simples de explicar com o exemplo real:

alias mc="mvn compile"
alias mt="mvn test"
alias mp="mvn package"
alias mi="mvn install"

alias mcc="mvn clean compile"
alias mct="mvn clean test"
alias mcp="mvn clean package"
alias mci="mvn clean install"

alias mcco="mvn clean compile --offline"
alias mcto="mvn clean test --offline"
alias mcpo="mvn clean package --offline"
alias mcio="mvn clean install --offline"

Portanto, estou tentando criar uma função para criar aliases sem ter que copiar e colar todos esses comandos se quiser adicionar um novo subcomando como validate . Deve ser simples criar os aliases relativos ( mv , mcv , mcvo ) ou a mesma coisa com uma nova opção como --debug ( mccd , mctd , mcpd , mcid ).

Eu tentei algo como:

m="mvn "
c="clean "
p="package "
"'$m$c$p'" # doesn't work
    
por Andrea Bergonzo 06.10.2017 / 23:02

1 resposta

0

Tenha cuidado ao fazer isso.

Adicionar um comando validate aqui criará um mv alias, sombreando o comando mv usado para mover arquivos. Você pode se deparar com outros conflitos de nomenclatura. Minha solução abaixo fornece alguma proteção, mas não ajudará se você definir um alias e, em seguida, adicionar um executável com o mesmo nome ao seu $PATH posteriormente. Se você citar o comando ao executá-lo (por exemplo, "mv" ), isso impedirá a expansão do alias e executará o comando real, não o alias.

Para a solução:

Você pode apará-lo dando um loop nos comandos e apenas tendo um comando alias por conjunto de opções. Para adicionar mais conjuntos de alias na hora, podemos colocar os comandos em uma função:

gen_aliases() {
    local cmd="${1:?No command to create aliases for.}"
    local c=${cmd:0:1}
    which -s m${c} || alias m${c}="mvn $cmd"
    which -s mc${c} || alias mc${c}="mvn clean $cmd"
    which -s mc${c}o || alias mc${c}o="mvn clean $cmd --offline"
}

for cmd in compile test package install; do
    gen_aliases "$cmd"
done

${parameter:?word} é uma expansão de parâmetro que grava word no erro padrão e sai da função ou script se parameter não estiver definido ou nulo. Nos dá alguma verificação de sanidade para ter certeza de que não criaremos aliases se não recebermos um comando para isso.

${parameter:offset:length} é uma expansão de parâmetro que se expande para length caracteres de $parameter iniciando em offset , por isso ${cmd:0:1} nos fornece o primeiro caractere de $cmd .

which word verifica se word existe em qualquer lugar em $PATH . O -s silencia, portanto, apenas obtemos o valor de saída ( 0 se encontrado, 1 se não encontrado), que usamos com || para executar os comandos alias somente se which fez não localize word em $PATH .

Verificando os resultados:

$ type mc
mc is aliased to 'mvn compile'
$ type mcpo
mcpo is aliased to 'mvn clean package --offline'

E adicionando outro conjunto de aliases:

$ gen_aliases validate
$ type mv
mv is /bin/mv
$ type mcv
mcv is aliased to 'mvn clean validate'
    
por 07.10.2017 / 01:03