cat
concatena os arquivos dados como argumentos na linha de comando para a saída padrão, ele lê os bytes de cada vez e, como padrão, não executa nenhuma interpretação dos bytes que lê.
No seu primeiro exemplo, você está redirecionando o stdout para um arquivo, e é por isso que você obtém um novo arquivo.
No seu segundo exemplo, os bytes são gravados no terminal, e é o terminal que interpreta sequências de caracteres como sequências de controle para o terminal, por isso você obtém um comportamento incomum no seu terminal. Não tem nada a ver com cat
como tal, cat
não sabe o que você vai fazer com sua saída. Você pode estar enviando através de um pipe para outro programa para interpretar / processar / imprimir ou tocar "Cantando na chuva".
Seguindo a filosofia do unix,
do one thing, do one thing only, but do it well
cat
não deve tentar adivinhar o que você está tentando fazer.
edite 1 resposta ao primeiro comentário do @kiwy abaixo.
Sim e Não, deixe-me explicar,
Não, se você cat
para um terminal, porque ele (o software do terminal) está enviando a saída para sua tela ou interpretando seqüências de controle (está emulando uma peça antiga de hardware, ou seja, um dispositivo teletipo ).
mas
Sim, se você usa um pipe e o programa que recebe pode interpretar os caracteres como comandos.
veja isso como um exemplo, cat anyOldShellScript | bash
bash interpretará o que é obtido como comandos.