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.