Как правильно постоянно искажать терминал bash?

Это тоже работает:

set -f; printf '%s ' $(cat infile )
6
09.11.2015, 16:13
3 ответа

Это похоже на набор специальных графических символов DEC.

Читая xterm control sequences docs, похоже, что терминал использует их при получении ESC ( 0).

Так что вы должны быть в состоянии воспроизвести, используя

printf '\033(0'

или

printf '\033(0' > corrupt-my-terminal
cat corrupt-my-terminal

И вернуться, используя

printf '\033(B'

который, согласно той же странице, выбирает USASCII.


Другие способы восстановления состояния включают

tput sgr0  # resets all terminal attributes to their defaults

и

reset      # reinitializes the terminal

Вы можете tput sgr0 в PROMPT_COMMAND (bash), или precmd (zsh), чтобы убедиться, что оно всегда сбрасывается автоматически.


Или вы можете просто убедиться, что используете less, vim, или что-либо другое, кроме cat для просмотра файла.

Чтобы заставить less действовать как cat и автоматически выходить из файла, если его длина меньше одной страницы, выполните less -FX или export LESS=-FX.

Или, если вы не хотите всегда использовать эти опции less, сделайте новый псевдоним, например,

alias c='less -FX'
10
29.04.2021, 00:21

Наиболее распространенный способ случайного выбора графического набора символов в эмуляторе VT100 - это получение символа Control-N , также известный как сдвиг. Если вы выбрали двоичный файл и в нем есть байт со значением '\ 14', это может привести к тому, что эмулятор терминала переключится на набор графических символов. Он отменяется после получения символа Control-O , сдвига (или с помощью управляющей последовательности, которая сбрасывает терминал). Он не зависит от bash или любой другой оболочки, которая может работать в эмуляторе терминала.

Для эмулятора терминала, работающего внутри эмулятора терминала, семантика может быть немного сложной. Например, вот как screen обрабатывает это:

Когда логическая возможность 'G0' присутствует в записи termcap для терминала, на котором был вызван экран, эмуляция экрана терминала поддерживает несколько символов наборы. Это позволяет приложению использовать, например, набор графических символов VT100 или наборы национальных символов. Поддерживаются следующие функции управления из ISO 2022: 'блокировка переключения G0' ('SI'), 'блокировка переключения G1' ('SO'), 'блокировка переключения G2', 'блокировка переключения G3', 'одинарная передача G2', и «односменный G3». Когда виртуальный терминал создается или сбрасывается, набор символов ASCII обозначается от «G0» до «G3». Когда присутствует возможность «G0», screen оценивает возможности «S0», «E0» и «C0», если они есть. «S0» - это последовательность, которую терминал использует для включения и запуска набора графических символов, а не «SI». «E0» - это соответствующая замена для «SO». «C0» задает строку перевода символа за символом, которая используется в полуграфическом режиме.

2
29.04.2021, 00:21

В аналогичном сценарии с использованием Bitvise SSH Client ни reset, ни tput sgr0не помогли мне восстановить нормальное отображение терминала.

После некоторых исследований я определил оскорбительного персонажа0x0E(SHIFT OUT):

Я смог распутать его слепым эхом0x0F(SHIFT IN):

echo -e '\x0f'
0
29.04.2021, 00:21

Теги

Похожие вопросы