Resposta curta
- Você pode quase sempre assumir que não é culpa do
cat
; é muito difundido, bem testado e simples para ter erros tão grandes e óbvios. - Não apenas
cat
um arquivo binário para o seu terminal; terminais são projetados para mostrar texto, não dados binários arbitrários.
Resposta longa
Não é o processo cat
em si que fica preso, mas o emulador de terminal, ou seja, o programa que exibe a janela. cat
não poderia se importar menos com o que está realmente no arquivo, tudo o que ele faz é copiar o que estiver nele para o stdout¹. Você pode (teoricamente) cat /dev/sda
e, felizmente, despejar todo o conteúdo do HDD no seu terminal.
Os emuladores de terminal não são projetados para exibir dados binários arbitrários. Eles são feitos para mostrar texto, e é possível controlar como o texto é exibido, incorporando sequências especiais de caracteres não imprimíveis neles, chamados códigos de controle ou códigos de escape , já que a maioria deles começa com o" caractere de escape "( \x1B
, geralmente exibido como ^[
).
Agora, se você despejar dados binários em seu terminal, ele poderá ver um caractere de escape (ou qualquer outro caractere especial) e tentar interpretar um código de escape a partir dele. Isso significa que ele não exibirá os seguintes caracteres, pelo menos até que possa decidir se eles realmente formam uma sequência válida ou não. Outra possibilidade é que há uma seqüência válida embutida em algum lugar que desencadeia um comportamento especial, como anular o terminal (e fazer com que pareça que nada foi impresso) ou alterar a cor de primeiro plano (e tornar toda a saída subsequente invisível).
Assumirei que nos dois computadores diferentes em que você estava testando, você usou emuladores de terminal diferentes, o que explicaria os diferentes comportamentos que você estava vendo: nem todos os TEs reconhecem todos os códigos de escape, pois alguns implementam códigos privados. seqüências para alguns comportamentos exclusivos (como o protocolo de exibição de imagem raster de kitty
).
¹) Existem alguns sinalizadores para cat
, como -t
sugerido nos comentários, que o manipulam antes de imprimi-los. Veja man cat
para mais informações.
O que você pode fazer
Às vezes, você pode querer ou precisar examinar os bytes reais em um arquivo. Nessas situações, você deve usar um software especializado chamado editor hexadecimal, que exibe a representação hexadecimal de cada byte no arquivo, tornando assim seguro imprimir em um terminal.
Para fins de visualização simples, você também pode usar o programa xxd
, que pode ser enviado com vim
ou autônomo (dependendo da sua distribuição).
Você pode extrair os vários textos que podem estar presentes em qualquer arquivo binário usando strings
, que está incluído em binutils
na maioria das distros. (Obrigado ao @Rui F Ribeiro por apontar)