Vamos ver o que está acontecendo aqui:
$ set -x
$ c file
+ unalias c
+ alias c=crystal file
bash: alias: file: not found
$ set +x
Portanto, c file
é expandido para unalias c; alias c=crystal file
(por meio de uma expansão intermediária para crystal file
).
alias c=crystal file
não faz sentido. O que eu acho que você pode querer é que crystal file
seja executado.
Você pode renomear os aliases que alteram os significados de c
:
alias usecrystal="alias c=crystal"
alias usecargo="alias c=cargo"
Como alternativa, você pode proteger o comando da expansão de alias:
alias c="\crystal"
alias crystal="alias c=\crystal"
alias cargo="alias c=\cargo"
Ou use command
(que parece melhor para IMHO):
alias c="command crystal"
alias crystal='alias c="command crystal"'
alias cargo='alias c="command cargo"'
O comando command
também protege da expansão do alias.