Acabei escrevendo este roteiro. Eu explico por que no final.
Adiciona novos aliases ao arquivo .aliases e os carrega imediatamente. Ele não acrescenta duplicatas duas vezes, portanto, se você definir o mesmo alias mais de uma vez, ele atualizará as versões anteriores, em vez de enviar spam para seu arquivo de configuração com duplicatas.
ALIASES_FILE_PATH=$HOME/.aliases
function save-alias() {
ALIAS_NAME='echo "$1" | grep -o ".*="'
# Deleting dublicate aliases
sed -i "/alias $ALIAS_NAME/d" $ALIASES_FILE_PATH
# Quoting command: my-alias=command -> my-alias="command"
QUOTED='echo "$1"\" | sed "s/$ALIAS_NAME/$ALIAS_NAME\"/g"'
echo "alias $QUOTED" >> $ALIASES_FILE_PATH
# Loading aliases
source $ALIASES_FILE_PATH
}
Outra versão
Em vez de usar um arquivo separado para aliases, ele os armazena no próprio arquivo de configuração (.zshrc ou .bashrc). Ele também anexa aliases apenas a um local especificado no arquivo de configuração, para que você possa manter outras coisas abaixo dos aliases, se quiser. Ele adicionará os aliases antes de "# END ALIASES", portanto, certifique-se de ter essa string exata. Então, por exemplo, seu arquivo de configuração ficará assim:
plugins=(git)
#and bla bla bla
# ALIASES
alias test-alias="echo I was added automatically"
# END ALIASES
# Yes you can have the bottom of the config file free.
# Because it will store aliases inside ALIASES block
source $ZSH/oh-my-zsh.sh
# and etc
O que é realizado pelo seguinte código:
CONFIG_PATH=$HOME/.zshrc
function save-alias() {
ALIAS_NAME='echo "$1" | grep -o ".*="'
# Checking whether the alias name is empty.
# Otherwise sed command later will match and delete every alias in the file
if [[ -z "$ALIAS_NAME" ]]; then
echo 'USAGE: save-alias alias_name="command" ' 1>&2
echo ' save-alias hello="echo hello world" \n' 1>&2
echo "Wrong format. Exiting..." 1>&2
exit 1
fi
# Deleting dublicate aliases
sed -i "/alias $ALIAS_NAME/d" $CONFIG_PATH
# Quoting command: my-alias=command -> my-alias="command"
QUOTED='echo "$1"\" | sed "s/$ALIAS_NAME/$ALIAS_NAME\"/g"'
# Appending the command to the config (before "# END ALIASES")
sed -i "/# END ALIASES/i alias $QUOTED" $CONFIG_PATH
#reloading config file.
source $CONFIG_PATH
# instead of reloading the whole config you might want to append
# to a new file as well, then source it and then rm new file
}
Por que não outras soluções apresentadas aqui?
echo "alias ${1}" >> $HOME/.bash_aliases
Existem dois problemas com eles.
1. Citações são removidas
Com o comando acima (representado como "save-alias"), o seguinte falhará
save-alias test-alias="echo hello world"
Ele falhará porque aspas serão removidas e anexará o comando como
alias test-alias=echo hello world
e falhará com os seguintes erros:
bash: alias: hello: not found
bash: alias: world: not found
A solução é usar aspas duplas:
save-alias test-alias='"echo hello world"'
que é um pouco chato
2. Eles acrescentam duplicatas.
Se você executar um comando duas vezes, descobrirá que o mesmo alias será adicionado duas vezes ao arquivo de configuração:
alias test-alias="echo hello world"
alias test-alias="oh no the config file is getting spammed"