Como criar um alias que realmente estende outro alias com o mesmo nome no Bash?
Por quê:
Eu costumava ter GREP_OPTIONS
definido em .bashrc
para algo como isto:
GREP_OPTIONS="-I --exclude=\*~"
Eu também tinha um script (digamos setup-java.sh
) que eu chamaria antes de trabalhar em alguns projetos Java. Ele conteria a linha:
GREP_OPTIONS="$GREP_OPTIONS --exclude-dir=classes"
Se eu também usar Sass, eu chamaria setup-sass.sh
que contém a linha:
GREP_OPTIONS="$GREP_OPTIONS --exclude-dir=\*/.sass-cache"
Mas GREP_OPTIONS
foi preterido e, aparentemente, a solução padrão é criar um alias ou algum script ...
Respostas:
O Bash armazena os valores dos aliases em uma matriz chamada
BASH_ALIASES
:Com a expansão de parâmetros , podemos obter o último alias definido (se existir) ou o valor padrão:
Agora basta fazê-lo
setup-java.sh
:... e finalmente em
setup-sass.sh
:Se as três linhas são chamadas, obtemos o que queremos:
fonte
aliases
cadeia se você terminar com espaços.Você pode escrever scripts inteiros dessa maneira, se for louco o suficiente. De qualquer forma, se você deseja estender um alias, verifique se o alias que deseja estender termina em um espaço e prenda outro.
fonte
exdir
? (Isso é apenas para alinhamento por razões estéticas?) #fnmatch(){ alias fnmatch='case $1 in '; while "${1:+:}" 2>&-; do eval 'fnmatch pattern list ;; esac'; shift; done; unalias fnmatch; }; alias pattern='${1:+*}) ' list=': do stuff '; fnmatch "$@"
. Fazer issoaliases
permite que você use as expansões dos padrões de maneira mais direta e segura. Você precisa de um segundo contexto w /eval
quando chamado de dentro de uma função, mas não é inerentemente inseguro, desde que os nomespattern
elist
sejam controlados por você. Eles só podem quebrar na maioria dos casos, mesmo quando não estiverem, a menos que algum invasor conscientemente termine corretamente o seucase
..bashrc
:alias sudo='sudo '
, isso deixa-me chamar todos os meus comandos alias depois de umsudo
. Sem o espaço que não iria funcionarUma função é uma opção melhor do que um alias extensível aqui.
Dessa forma, você tem duas opções para adicionar opções ao ambiente:
Alterar a
grep_options
matriz; isso suporta corretamente opções com espaços, caracteres literais glob e outros casos de canto:Use a
GREP_OPTIONS
variável escalar tradicional , apesar de suas armadilhas (consulte o BashFAQ # 50 para entender algumas delas):Dito isto, se você deseja que suas opções sejam refletidas por
grep
instâncias invocadas fora do shell, nem um alias nem uma função servirão. Em vez disso, você desejará um script de wrapper colocado anteriormente no seu PATH do que ogrep
comando real . Por exemplo:... e, em
~/bin/grep
:fonte