Intereting Posts
Есть ли способ POSIX для установки нулевого аргумента целевого приложения? Символы, не работающие с плавким предохранителем GlusterFS Компилировать пакет без установки необходимых библиотек Не работает файловая система tune2fs / dev / kvm разрешено в vnc-сеансе Тема выглядит по-разному в зависимости от местоположения в FS? Разрешения на удаление всех файлов в подкаталоге Пользователь без пароля – как войти в эту учетную запись из учетной записи, отличной от root bash: нет контроля работы в этой оболочке Как обеспечить, чтобы разделяемая библиотека имела страницы памяти, используемые несколькими процессами? Как сделать tmux count windows начиная с 1 вместо 0? Псевдонимы против функций и скриптов Часто используемые команды «ps» (статус процесса) в Linux? Можно ли использовать переменную среды для определения псевдонима? Какие файлы необходимо удалить перед дублированием виртуальной машины?

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

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

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

Непечатаемые последовательности должны быть заключены в \[ и \] . Глядя на ваш 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 должно быть вне \[...\] если у вас многострочный запрос. Мне потребовалось несколько проб и ошибок, чтобы наконец понять это.