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'