Por que usar cat em arquivos binários bagunçou o terminal e como?

7

Se eu entendi corretamente o manual cat :

concatenate files and print on the standard output

cat pegará arquivos como argumento e os imprimirá na saída padrão.
O que eu não entendo é se eu usar o comando

cat img.png > copy.png

Eu vou obter 2 arquivos png idênticos, enquanto se eu apenas

cat img.png  

Eu tenho toda a chance de meu terminal ficar confuso e interpretar mal o que eu digito.

Como isso é possível?
O valor binário ainda é um dado binário porque não mostra simplesmente uma série de 0 e 1 ou a interpretação desses dados binários em ASCII ou qualquer que seja a codificação no terminal? Esse comportamento também é possível por cat ing um arquivo de texto contendo caracteres estranhos?

Editar 1:

Um mecanismo para evitar esse comportamento, como o try {} catch {}, deve ser implementado?

    
por Kiwy 13.03.2014 / 10:54

2 respostas

7

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.

    
por 13.03.2014 / 11:08
0

Acho que isso acontece principalmente por causa de caracteres não imprimíveis com códigos abaixo de 0x20. Esses são códigos especiais de controle / escape, que são usados para teclas como Backspace, Delete, etc.

    
por 13.03.2014 / 11:06