Как решить проблему с ошибкой экрана терминала? (обычно после изменения размера)

76

Иногда экран терминала man lsпортится , и когда мы используем для чтения справочные страницы или нажимаем стрелку ВВЕРХ для перехода к предыдущим командам в истории, на экране будут отображаться символы не в нужном месте. (например, трактуйте конец экрана как середину экрана).

Команда resetопробована, и она не будет работать. Один из способов, который работает, - выйти из системы или закрыть окно и сначала изменить его размер, а затем сделать это ssh(или закрыть эту вкладку и изменить размер окна, а затем открыть новую вкладку, чтобы получить новую оболочку).

Но таким образом мы потеряем все, что делали ранее, например, запустили консоль виртуальной машины и т. Д. Итак, если мы не закроем оболочку, есть ли способ решить эту проблему?

(это происходило раньше прямо в Fedora, а также для Macbook sshв коробке RHEL 5.4).

Обновление: теперь я помню, как это произошло в Fedora: я открыл терминал и создал FreeVM для использования консоли виртуальной машины (оболочки). Я думаю, что это был размер 80 x 25, а затем через некоторое время я изменил размер терминала примерно до 130 x 50, а затем «внутренняя оболочка» (виртуальной машины) начала вести себя странно).

nopole
источник
Какой эмулятор терминала вы используете? Звуки сломаны, если resetне решить проблему.
Иордания
любую программу терминала внутри Fedora ... и программу терминала по умолчанию в Mac OS X Lion.
Nopole
Пожалуйста, смотрите обновление выше о том, как это произошло в Fedora
nopole
3
Волшебное заклинание есть ^Jreset^J, где ^Jозначает нажим ctrl-J. Или (на графических терминалах) вы можете попробовать Resetкнопку. Кроме того, некоторые программы просто не готовы к изменению размеров терминала под ними (да, древнее программное обеспечение живо и работает) или просто плохо себя ведут, когда терминал становится слишком маленьким.
vonbrand
1
Мои проблемы возникли из-за того, что bash неправильно рассчитал длину приглашения, потому что в нем были цветовые коды; Мне не хватало escape-символов \ [и \] - см. Unix.stackexchange.com/questions/105958/…
qneill

Ответы:

93

Если вы используете bash, проверьте, активирована ли опция "checkwinsize" в вашей сессии, используя

shopt | grep checkwinsize

Если вы не получите

checkwinsize    on

затем активируйте его

shopt -s checkwinsize

Bash документация говорит для атрибута "checkwinsize":

«Если установлено, Bash проверяет размер окна после каждой команды и, при необходимости, обновляет значения LINES и COLUMNS».

Если вам нравится настройка, вы можете активировать checkwinsizeв своем ~/.bashrc.

  • Активировать: shopt -s checkwinsize
  • Чтобы деактивировать: shopt -u checkwinsize
Arcadien
источник
6
Это не решает мою проблему, но это хороший общий ответ, так что +1 в любом случае. Я думаю, что моя проблема связана с эмуляцией Windows (?) При подключении к серверу Linux.
Geneorama
Сначала мне показалось, что это не сработало, когда я использовал стрелки вверх, чтобы увидеть историю, но сразу после первой выполненной команды это все исправило. Использование терминатора в моем случае. Спасибо +1
kstenger
это сработало для меня, но только отключив checkwinsize. по какой-то причине после каждой команды устанавливалось значение LINES = 24, хотя мое окно (содержащее сеанс picocom) было намного выше.
Майкл
19

Вы можете попробовать Ctrl+ L. Он очищает и / или перерисовывает экран терминала в зависимости от программы.

BlueBomber
источник
3
но это не решает проблему навсегда ...
nopole
Я думаю, я имел в виду, что если вы нажмете CTRL L, то на данный момент строка в порядке, но если вы снова отредактируете строку (или в следующей
набранной
11

добавление этих опций в docker exec, похоже, решило мою проблему

-e COLUMNS=$COLUMNS -e LINES=$LINES -e TERM=$TERM
Оран Агра
источник
1
ты тот, кто задал вопрос 5 лет назад?
Архемар
3
Я могу сказать вам, что он не: «докер» не совсем подходит для «5 лет назад». Докер еще не был выпущен в январе 2013 года ;-)
jplandrain
8

У меня была та же проблема, и ни один из вышеперечисленных рецептов не сработал для меня, потому что я считаю, что мой bash никогда не получает SIGWINCHсигналы, которые перехватываются его родительским процессом.

Я наконец нашел решение. Я добавил в мой .bashrc:

export PROMPT_COMMAND="resize &>/dev/null ; $PROMPT_COMMAND"

Теперь каждый раз, когда я получаю новое приглашение, мое окно перестраивается.

Спасибо UKmonkey за улучшение PROMPT_COMMAND.

Энтони Скемама
источник
2
Я лично согласился бы с export PROMPT_COMMAND="resize &>/dev/null; $PROMPT_COMMAND"тем, чтобы старая команда подсказки, какой бы она ни была, будет сохранена
UKMonkey
Я бы просто запустить изменение размера вручную, когда это необходимо. Опрос консоли по размеру может быть медленным. Выполнение каждой команды кажется чрезмерным, и обычно вы знаете, когда она была изменена.
Конрад Мейер
6

Я просто хотел добавить к тому, что Аркадьен уже упоминал. Включение checkwinsize делает свое дело, но мне нужно было сбросить размер окна, чтобы оно работало должным образом. Я полагаю, что размер контрольного размера должен был устранить это, но все же, стоит попробовать. Просто попробуйте изменить размер окна или не максимизировать и развернуть его, опубликуйте эту опцию.

saketrp
источник
1
Хотите верьте, хотите нет, но это было все, что нужно, чтобы починить мою. Забавно, потому что я попробовал все остальное в первую очередь.
Таранаки
4

Время от времени я сталкиваюсь с одной и той же проблемой, используя zsh на macOS. Простой вызов resetкоманды снова настраивает терминал на мой вкус.

nonocut
источник
Таким образом, ФП упомянул, что resetэто не работает для них, и это было на самом деле суть вопроса ....
Стивен Раух
ОП упомянул о том, что он не работает на вкусах Linux. Я столкнулся с проблемой на MacOS Sierra и resetработал в этом случае. Я добавил этот ответ, чтобы помочь любому, кто сталкивается с той же проблемой на MacOS и не знает о resetкоманде.
nonocut
resetработает на Windows Putty с Ubuntu 16.04!
musbach
перезагрузка работала на Ubuntu 16.04
Zsh
2

У меня была та же проблема, что и у вас, и это то, что я сделал: у
меня есть .profileнастройки в моем пользователе, так что именно здесь я делаю все свои изменения.

Есть пакет, xtermкоторый называется через который apt-getя не знаю yum. Но я сделал локальную установку из источника, так как у меня нет прав на установку. ССЫЛКА: http://invisible-island.net/xterm/#download

./configure --prefix=/the/path/you/want/to/install/to
make
make install

Я экспортировал путь в своем профиле и вызвал его в том же месте

export PATH=$PATH:/the/path/you/want/to/install/to
resize

Так что теперь каждый раз, когда я вхожу, размер терминала устанавливается соответственно изменением размера.

FoldedChromatin
источник
1

Ну, это общая проблема, и должно быть простое решение.

Если другие меры, такие как Ctrl + A, Ctrl + L не работают, попробуйте использовать stty:

  1. Ctrl + T: открыть новую вкладку с локальной оболочкой.
    Или: выйдите из экрана (Ctrl + AD, чтобы отсоединиться) и выйдите из сеанса SSH.
  2. stty -a | grep rows: Получить количество строк и столбцов.
    Пример:speed 38400 baud; rows 33; columns 133; line = 0;
  3. Вернитесь на удаленную вкладку или войдите и снова подключите экран. sttyВыход должен быть различным.
    Пример:speed 38400 baud; rows 47; columns 177; line = 0;
  4. Введите stty rows Nи stty columns Nгде N - «реальное» число (вне экрана). Пример:$ stty rows 33; stty columns 133

Если вы используете терминатор , вы можете пропустить первые три шага, потому что он показывает количество столбцов и строк в верхней части.

Вам не нужно изменять размеры окон терминала, чтобы столкнуться с этим. Администраторы обычно входят в систему с разных компьютеров, и когда подключенные мониторы различаются по размеру (разрешению), развернутое окно будет иметь разный размер на каждом компьютере. На самом деле довольно сложно не сталкиваться с этим часто.

И результат не только в том, что некоторые справочные страницы не отображаются должным образом. Это почти все, что использует пейджер - первые несколько строк часто отсутствуют (например). И даже не думайте об использовании VIM в таком смещенном терминале. Вы хотите выделить строку 3 (V), чтобы заменить ее, но когда вы это сделаете, выделенный текст будет текстом другой строки.

basic6
источник
Кажется, что CentOS не меняет размеры - используйте «stty row 66», чтобы добиться цели.
Расс
0

Попробуй stty sane. это должно делать то, что вам нужно.

phil294
источник