Вывод терминала неверно

У меня проблема: если я набираю очень длинные команды в bash, терминал не будет отображать то, что я набираю правильно. Я бы ожидал, что если бы у меня была команда вроде следующего:

username@someserver ~/somepath $ ssh -i /path/to/private/key myusername@something.someserver.com 

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

 myreallylongusername@something.somelongserver.comh -i /path/to/private/key 

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

Дополнительное развлечение происходит, когда I Up до предыдущей команды. Я пробовал это как в гном-терминале, так и терминаторе, а также на i3 и Cinnamon. Кто-то предположил, что это моя подсказка, так вот вот что:

 \[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\] 

Ctrl l , reset и clear всех делают то, что они говорят, но когда я набираю команду обратно или Up, то происходит то же самое.

Я проверил, и checkwinsize включен в bash. Это происходит при 80×24 и других размерах окна.

Это что-то, чему я научился жить? Есть ли какая-то магия, которую я должен знать? Я решил использовать только короткое приглашение, но это не устраняет проблему.

  • Как предотвратить случайную выходную консоль от взлома терминала?
  • Как я могу получить мигающий курсор в KDE Konsole?
  • печать нескольких отдельных изображений на одной физической бумажной странице с терминалом
  • Как создать последовательность «\ e [Z» в терминале?
  • Захват содержимого строки состояния tmux
  • Печать заполненных форм в терминале
  • Как автоматически открыть окно терминала при нажатии на скрипт?
  • Как найти общее имя для конкретного глифа?
  • 5 Solutions collect form web for “Вывод терминала неверно”

    Непечатаемые последовательности должны быть заключены в \[ и \] . Глядя на ваш PS1, он имеет незакрытую последовательность после \W Но вторая запись избыточна, а также повторяет предыдущее утверждение «1; 34» .

     \[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\] |_____________| |_| | | +--- Let this apply to this as well. 

    Таким образом, это должно было иметь смысл окраски:

     \[\033[1;32m\]\u:\[\033[1;34m\] \W \$\[\033[0m\] |_____| | +---- Bold blue. 

    Сохранение «оригинала» должно также работать:

     \[\033[1;32m\]\u:\[\033[1;34m\] \W\[\033[1;34m\] \$\[\033[0m\] |_| |_| | | +-----------+-- Enclose in \[ \] 

    Редактировать:

    Причина такого поведения заключается в том, что bash считает, что приглашение длиннее, чем оно есть на самом деле. В качестве простого примера, если вы используете:

     PS1="\033[0;34m$" 1 2345678 

    Приглашение считается 8 символами, а не 1. Как таковое, если окно терминала – 20 столбцов, после ввода 12 символов, считается, что он равен 20 и обертывается вокруг. Это также очевидно, если затем попытаться сделать backspace или Ctrl + u . Он останавливается в столбце 9.

    Однако он также не запускает новую строку, если она не находится в последнем столбце, в результате первая строка перезаписывается.

    Если продолжать печатать строку, она должна быть перенесена на следующую строку после 32 символов.

    Это в основном связано с размером окна, предполагаемого терминалом, не таким, как ваш фактический размер окна. Если вы используете bash, вы можете попробовать это.

     $ shopt | grep checkwinsize 

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

     checkwinsize on 

    Затем активируйте его с помощью

     $ shopt -s checkwinsize 

    Затем просто попробуйте запустить другую команду (например, ls ) или изменить размер окна один раз, это работает для меня каждый раз.

    В частности, для систем Redhat проблема часто возникает из-за неправильной настройки ~/.bashrc чтобы не вызвать /etc/bashrc . Обычно bash загружает ~/.bashrc который, как ожидается, вызывается /etc/bashrc , который по умолчанию содержит shopt -s checkwinsize .

    Это звучит как проблема с настройками переменных окружения COLUMNS & LINES . Когда вы изменяете размер окна, они обычно устанавливаются автоматически с помощью gnome-terminal (я полагаю), вы можете принудительно их настроить вручную, изменив resize команды.

    пример

    Если я изменю размер моего гнома-терминала до 79×17, мои переменные появятся следующим образом:

     $ echo $COLUMNS; echo $LINES 79 17 

    Я могу заставить это так:

     $ resize COLUMNS=79; LINES=17; export COLUMNS LINES; 

    Чтобы предотвратить обертывание, вы также можете увеличить количество столбцов, например,

     stty columns 120 

    Как упоминалось в других ответах, непечатаемые последовательности, такие как \e[0;30m должны быть обернуты \[...\] .

    Кроме того (и то, о чем я еще не упоминал), кажется, что \r\n должно быть вне \[...\] если у вас многострочный запрос. Мне потребовалось несколько проб и ошибок, чтобы наконец понять это.

    Linux и Unix - лучшая ОС в мире.