Что означает вывод, когда Вы делаете cat image.png
?
Это то, из чего на самом деле сделано изображение?
Имеет значение, какое расширение файла изображение имеет?
cat
распечатает содержимое файла (нули и единицы, которые будут сопоставлены с бессмысленными символами, потому что они на самом деле не символы, верно?) В stdout
, который по умолчанию является вашим терминал.
Расширение файла предназначено для нас (людей), чтобы легко определить, какой тип файла; некоторые программы используют его и для открытия, но в большинстве случаев программы определяют тип файла по заголовку внутри файла.
Используйте файл file.png
, чтобы получить тип файла, или xxd file.png
:
00000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR
00000010: 0000 0002 0000 0002 0800 0000 0057 dd52 .............W.R
00000020: f800 0000 0e49 4441 5478 9c63 6c60 6062 .....IDATx.cl``b
00000030: 6000 0002 9200 84f7 7ca3 5800 0000 0049 `.......|.X....I
00000040: 454e 44ae 4260 82 END.B`.
, чтобы получить шестнадцатеричный дамп содержимого файла, обратите внимание на «PNG» в первой строке.
Также из этой ссылки на сигнатуры файлов мы видим, что сигнатура PNG имеет вид:
PNG 89 50 4E 47 0D 0A 1A 0A PNG image
Изображения состоят из байтов. То же самое и с текстовыми файлами
. Когда программное приложение, например cat
, хочет читать текстовые файлы, оно начинает чтение байтов и ищет эти байты в кодировках символов, таких как ascii или unicode. Он находит символ в таблице и отображает его.
Но изображения не имеют символов (они могут, но это не то, что строит изображение), и вы можете догадаться, что происходит, когда вы пытаетесь обрабатывать отформатированные байты изображения, как символы. вы получаете случайные символы для каждого файла.
Если вы хотите увидеть строки файла, используйте команду strings
.
cat
просто выводит содержимое файла в stdout
stream , который в вашем случае оказывается терминальным. Что происходит с последовательностью нулей и единиц, составляющих файл, зависит от терминала. В случае двоичного файла последовательности битов, не являющиеся текстом, не будут распознаны как текст.
Рассмотрим, например, cat
файл, содержащий символы UTF, например китайский язык, на двух разных терминалах - один из которых поддерживает символы UTF (терминатор
на снимке экрана ниже) и тот, у которого нет хорошей поддержки ( xterm
на скриншоте ниже). Как видите, некоторые символы не интерпретируются. cat
будет выводить содержимое в любом случае, но как интерпретировать это содержимое - это зависит от каждого терминала.
Теперь, если вы перенаправляете поток stdout
в файл, вы эффективное создание копии, почти такой же, как cp original copy
или mv old new
. В некоторых редких случаях вам может понадобиться соединить два файла - двоичный или текстовый - что также возможно с помощью cat
. Идея та же. В соответствии с определением POSIX , «[t] входные файлы могут быть любого типа», что означает, что cat
может читать любой файл. Однако в некоторых случаях cat
будет использовать текстовый режим. В случае Ubuntu cat
(который предоставляется пакетом GNU coreutils) информация, представленная в info cat
, гласит:
'cat' читает в текстовом режиме, если один из вариантов '- bensAE 'или если' кошка ' читает со стандартного ввода, а стандартный ввод - это терминал. Точно так же cat пишет в текстовом режиме, если одна из опций «-bensAE» или если стандартный вывод - это терминал.
Конечно, если мы действительно хотим просмотреть содержимое двоичного файла в читаемом формате, мы можем использовать шестнадцатеричные редакторы или программу любого типа «дамп», Midnight Commander ] файловый менеджер или даже текстовый редактор vi
. Там уже есть неплохой список здесь и здесь .