Você não pode forçar um processo do shell a usar novos aliases do lado de fora, portanto, o pedido para carregar os novos aliases terá que vir de cada instância do shell em cada terminal.
Você pode fazer o bash executar código após cada comando colocando esse código no PROMPT_COMMAND
variável. Então você poderia usar algo como
reload_aliases () {
. ~/.bash_aliases
}
PROMPT_COMMAND="$PROMPT_COMMAND
reload_aliases"
e defina seus aliases editando ~/.bash_aliases
em vez de digitá-los em um shell. Observe que a variável PROMPT_COMMAND
é executada apenas depois de executar um comando, portanto, é necessário executar um comando (por exemplo, :
, que é um comando que não faz nada); uma linha de comando vazia não é suficiente.
Você também pode substituir o comando alias
para anexar automaticamente ao arquivo .bash_aliases
, mas eu recomendo contra isso, porque seria muito prejudicial quando você quiser definir um alias específico da tarefa para apenas um shell. Você pode anexar um alias específico com sua definição no shell atual com o comando alias ALIASNAME >>~/.bash_aliases
(substituir ALIASNAME
pelo nome real do alias).
No zsh, você deve usar precmd
em vez de PROMPT_COMMAND
do bash . Ao contrário do bash PROMPT_COMMAND
, precmd
é realmente executado antes de exibir cada prompt, então pressionar Enter no prompt é o suficiente para invocá-lo. Mesmo o zsh não tem como recarregar o arquivo de alias sem intervenção do usuário.
Como alternativa, você pode fazer com que seu shell reaja a um sinal definindo um trap
. O sinal SIGUSR1 não é usado por shells, então você pode usar isso para fazer com que ele carregue seus aliases:
trap 'reload_aliases' USR1
(A função reload_aliases
é como acima.) Com essa abordagem, você precisa enviar um sinal SIGUSR1 para todas as instâncias interativas de seu shell ao editar sua lista de aliases. Certifique-se de não enviar o sinal para os scripts, porque a ação padrão para este sinal é matar o shell! Não há uma maneira fácil de listar shells interativos; o seguinte script específico do Linux chega perto, mas esteja ciente de que ele pode fechar acidentalmente um processo não relacionado por causa das condições de corrida.
for pid in $(pgrep bash); do
if cd "/proc/$pid" 2>/dev/null &&
[ -c fd/0 ] &&
grep '^SigCgt: .............[2367abef]..$' status; then
kill -USR1 "$pid"
fi
done