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

У меня проблема: если я набираю очень длинные команды в 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 и других размерах окна.

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

  • автопринятие ключа rsa в скрипте bash
  • Переименуйте несколько файлов в свои суффиксы
  • BASH: массив как строковый буфер
  • Как я могу применить карет-замену к моей n-й-последней команде?
  • Можем ли мы транслировать в tmux
  • Заменить символ алфавитом в зависимости от позиции в строке
  • Использовать использование команды ожидания в Linux?
  • Сценарий Bash - автоматический ввод пользовательского ввода (пароль хранилища ключей)
  • 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 должно быть вне \[...\] если у вас многострочный запрос. Мне потребовалось несколько проб и ошибок, чтобы наконец понять это.

    Interesting Posts

    docker создавать контейнеры без их запуска

    Kali Linux не видит мои разделы Windows!

    Вывод переменной не объединяется

    Как работает четкая команда?

    Focusrite Scarlett для сопоставления ввода Linux?

    Почему существуют разные пути для команды в разделе «Синопсис» на странице человека?

    Удалить зеленый из браузера Linux Mint

    Раздел все еще почти заполнен, но файлы, похоже, были потеряны. Что случилось?

    Как быстро добавить некоторое пространство в терминал?

    Предоставить перенаправление на команды, используемые в составных командах

    Как я могу запретить Linux Mint автоматически реагировать на подключенный внешний монитор и пытаться изменить настройки отображения?

    Как преобразовать специальный шестнадцатеричный символ из html-страницы в bash?

    Backticks как слова в цикле for приводят к странному поведению

    Указание строки командной строки tmux

    Как установить bash на FreeBSD

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