Если я cat
правильно понимаю руководство:
объединять файлы и печатать на стандартном выводе
cat
примет файлы в качестве аргумента и выведет их на стандартный вывод.
То, что я не получаю, это если я использую команду:
cat img.png > copy.png
Я получу 2 PNG-файла, идентичные, а если я просто
cat img.png
У меня есть все шансы, что мой терминал испортится и неправильно истолковывает то, что я печатаю.
- Как это возможно?
- Двоичные значения по-прежнему являются двоичными данными. Почему он просто не показывает последовательность из 0 и 1, или интерпретацию этих двоичных данных в ASCII, или какова бы ни была кодировка в терминале?
- Возможно ли такое поведение,
cat
используя текстовый файл, содержащий странные символы? - Должен ли быть реализован механизм предотвращения такого поведения, такой как оператор try {} catch {}?
reset
команда может помочь иногда, но это не чудо решения.reset
и нажатиемreset
клавиш Ctrl-J? Я не вижу ни одной (ни какой-либо причины пойти более сложным путем)Ответы:
cat
объединяет файлы, заданные в качестве аргументов в командной строке, со стандартным выводом, он читает байты за раз и по умолчанию не выполняет никакой интерпретации байтов, которые он читает.В первом примере вы перенаправляете стандартный вывод в файл, поэтому вы получаете новый файл.
Во втором примере байты записываются в терминал, и это терминал, который интерпретирует последовательности символов как управляющие последовательности для терминала, поэтому на вашем терминале происходит необычное поведение. Он не имеет ничего общего с
cat
этим,cat
не знает, что вы собираетесь делать с его выходом. Возможно, вы отправляете его через канал в другую программу для интерпретации / обработки / печати или воспроизведения "Поющих под дождем".Итак, следуя философии Unix,
cat
не следует пытаться угадать, что вы пытаетесь сделать.edit 1 ответ на первый комментарий @ kiwy ниже.
Да и нет, позвольте мне объяснить,
Нет, если вы
cat
подключены к терминалу, потому что он (программное обеспечение терминала) отправляет вывод на ваш экран или интерпретирует управляющие последовательности (он эмулирует старую часть оборудования, т. Е. Устройство телетайпа ).но,
Да, если вы привязаны к каналу и программа получения может интерпретировать символы как команды.
посмотрите на это в качестве примера,
cat anyOldShellScript | bash
bash будет интерпретировать то, что получает, как команды.источник
cat
двоичные файлы, которые могут содержать в простой текстовой инструкции, какrm -rf .
это может быть интерпретировано?echo
выводить их по своему усмотрению . См. Stackoverflow.com/questions/5947742/… чтобы узнать, как это сделать, и терминysys.demon.co.uk/vtansi.htm, чтобы узнать о том, что это возможноЯ думаю, это происходит в основном из-за непечатаемых символов с кодами ниже 0x20. Это специальные управляющие / escape-коды, которые используются для таких клавиш, как Backspace, Delete и т. Д.
источник