Я написал сценарий-оболочку, которому присвоил псевдоним cat
, называется safecat, что защищает меня от случайного cat
бинарные файлы и тонны визга из динамика моего ПК. Прямо сейчас он считает файл двоичным и откажется его обработать, если 30% или более символов на первой странице не являются текстовыми символами (диапазон ASCII 32-127 и \n
,\r
,\t
,\b
).
Мне просто пришло в голову, что у меня действительно нет проблем с обработкой двоичного файла, пока я не слышу визга, и мой терминал впоследствии не испортится. Есть ли набор символов или последовательностей символов, которые я могу специально искать и отказать кошке, если они есть? Так было бы надежнее.
Источник safecat.py:
Пытаться cat -vet
, что обеспечит преобразование всех управляющих символов в нечто безопасное для отображения на экране.
Да, признаюсь, я так запомнил, потому что это смешно;)
Я обхожу эту проблему, используя less в качестве пейджера вместо cat и используя прокрутку.
Less предупреждает вас: «Этот файл может быть двоичным, продолжить? [Y / N]».
Чаще всего проблемы вызывают символы ESC (27), SI (14), SO (15) и DC-3 / X-OFF (19). Некоторые терминалы поддерживают CSI (155 = 128 + 27) как краткую форму для введения последовательностей ESCape.
Escape (ESC) вводит управляющие последовательности. Shift-In (SI) и shift-out (SO) могут изменять наборы символов и другие функции. X-OFF (DC3) может остановить отправку терминалом любых данных. Звонок (8) может быть шумным.
Вы можете отфильтровать неформатирующие управляющие символы в диапазоне до десятичного числа 32. Наиболее часто используемые символы форматирования - это TAB (9), LF (10), CR (13) и FF (12). BS (7) и VT (11) сейчас используются реже.
Управляющие символы сгруппированы по функциям, что может облегчить фильтрацию.
Существующие инструменты уже достаточно хорошо справляются с этой проблемой. Рассмотрите возможность присвоения одному из них псевдонима cat. Это может нарушить цепочку команд. Вы всегда можете вернуть необработанного кота, добавив к команде обратную косую черту.
reset
исправит терминал, если вы окажетесь в неправильном наборе символов.
Если вы работаете в чистом ASCII, вам нужно пропускать только символы с 32 по 127, 13, 10 и 9. Те, что ниже 32, являются управляющими символами, кроме 13, 10 и 9, которые являются символами возврата каретки и перевода строки (используются для концов строки) и начала соответственно. Символы выше 127 не определены в ASCII, но обычно сопоставляются с чем-то, хотя именно то, что они сопоставляют, зависит от ваших текущих настроек кодовой страницы.
Один полезный инструмент, который следует запомнить, если вы хотите увидеть, какой текст находится в двоичном файле (например, текст справки и другая документация, хранящаяся в исполняемом файле или в каком-либо двоичном формате документа, для которого у вас нет читателя), является strings
команда. Он сканирует последовательности печатаемых символов и выводит их без остатка. вывод может быть передан другим инструментам, например grep
и less
. Это бесполезно, если текст сжат или иначе не является текстом боли. Вы можете обновить свою оболочку, чтобы вызвать this вместо cat
вместо того, чтобы просто отказываться что-либо делать (хотя я предлагаю сначала вывести сообщение, чтобы пользователь знал, что вывод содержимого был отфильтрован).
Проверить console_codes (4) страница руководства:
Символ является управляющим, если (до преобразования в соответствии с таблицей сопоставления) он имеет один из 14 кодов 00 (NUL), 07 (BEL), 08 (BS), 09 (HT), 0a (LF), 0b ( VT), 0c (FF), 0d (CR), 0e (SO), 0f (SI), 18 (CAN), 1a (SUB), 1b (ESC), 7f (DEL). Можно установить режим «отображение управляющих символов» (см. Ниже) и разрешить отображение 07, 09, 0b, 18, 1a, 7f в виде глифов. С другой стороны, в режиме UTF-8 все коды 00-1f считаются управляющими символами, независимо от любого режима «отображение управляющих символов».