enter faz a disciplina de linha do dispositivo terminal enviar o buffer de entrada atual mais \n (traduzido do \r enviado pelo terminal (emulador) pela configuração icrnl da disciplina de linha) para a aplicação que está lendo do dispositivo terminal. ^D faz a disciplina de linha do dispositivo de terminal enviar o buffer de entrada atual sem um caractere \n nor ^D (o caractere é eliminado pela disciplina de linha, a menos que você tenha enviado ^V antes).
Pressionar ^D duas vezes seguidas torna cat exit porque supõe que não há mais nada a ler ( read() retorna 0 byte).