Os aliases são como alguma forma de expansão de macro, semelhante ao pré-pré-processamento feito em C com #define
, exceto que em shells, não há delimitação clara e óbvia entre a etapa de pré-processamento e a de interpretação (também, aliases não são expandidos em todos os contextos e pode haver várias rodadas de expansão de apelidos como com aliases aninhados).
Quando você faz:
alias sourceProfile='source ~/.profile'
sourceProfile() {
something
}
A expansão do alias a transforma em:
source ~/.profile() {
something
}
que é um erro de sintaxe. E:
alias sourceProfile='source ~/.profile'
editProfile(){
vim ~/.profile && sourceProfile
}
Transforma em:
editProfile(){
vim ~/.profile && source ~/.profile
}
Portanto, se mais tarde você redefinir sourceProfile
como uma função, editProfile
não chamará, porque a definição de editProfile
tem o valor expandido do alias original.
Além disso, para funções (ou qualquer comando composto), os aliases são expandidos apenas na hora da definição da função (enquanto são lidos e analisados), e não no tempo de execução. Então isso:
editProfile(){
vim ~/.profile && sourceProfile
}
alias sourceProfile='source ~/.profile'
editProfile
não funcionará porque sourceProfile
não foi definido no momento em que o corpo da função editProfile
foi analisado e não haverá nenhuma expansão de alias no momento da execução da função editProfile
.
Portanto, evite misturar aliases e funções. E tenha cuidado com as implicações de usar aliases, pois eles não são realmente comandos , mas alguma forma de expansão de macro.