Dê uma olhada na sua função. Neste exemplo, mudei alguns nomes para indiciar os culpados e identifiquei algumas irrelevâncias para o seu problema:
recurse{} (
recurse "$@"
}
O que você acha que isso fará quando invocado?
Para corrigir isso, você pode chamar o binário explícito:
emacs () {
if [ $TERM != "xterm" ]
then
TERM=xterm /usr/bin/emacs "$@"
else
/usr/bin/emacs "$@"
fi
return;
}
Ou você pode confiar em seu caminho estar corretamente definido:
emacs () {
if [ $TERM != "xterm" ]
then
TERM=xterm command emacs "$@"
else
command emacs "$@"
fi
return;
}