У меня есть проблема, при которой, если я введу очень длинные команды в bash, терминал не отобразит то, что я печатаю правильно. Я ожидаю, что если бы у меня была команда, подобная следующей:
username@someserver ~/somepath $ ssh -i /path/to/private/key
myusername@something.someserver.com
Команда должна отображаться в две строки. Вместо этого он часто оборачивается и начинает писать поверх моей подсказки, примерно так:
myreallylongusername@something.somelongserver.comh -i /path/to/private/key
Если я решу вернуться и изменить какой-либо аргумент, я не скажу, где будет отображаться курсор, иногда в середине приглашения, но обычно в строке выше, где я печатаю.
Дополнительное веселье происходит, когда я Upк предыдущей команде. Я пробовал это и в терминале gnome, и в терминаторе, и на i3 и Cinnamon. Кто-то предположил, что это была моя подсказка, поэтому вот что:
\[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\]
Ctrll, reset
и clear
все делают то, что говорят, но когда я набираю команду обратно или происходит Upто же самое.
Я проверил и checkwinsize
включен в Bash. Это происходит в 80x24 и других размерах окна.
Это то, с чем я учусь жить? Есть ли какая-то магия, которую я должен знать? Я согласился только на использование очень короткого приглашения, но это не решает проблему.
env -i bash --norc
исправляет это. $ COLUMNS и $ LINES совпадают. Значит ли это, что с моим .bashrc что-то смешное?\[\033[01;32m\]\u: \[\033[01;34m\]\W \[\033[01;34m\] \$ \[\033[0m\]
кажется, избегает странностей в поведении - но не знаю, уважает ли оно ваше первоначальное приглашение полностью ...tput smam
Ответы:
Непечатаемые последовательности должны быть заключены в
\[
и\]
. Глядя на ваш PS1, у него есть нераскрытая последовательность после\W
. Но вторая запись является избыточной, а также повторяет предыдущее утверждение «1; 34» .Как таковой, он должен иметь предназначенную окраску:
Сохраняя «оригинал», это также должно работать:
Редактировать:
Причиной такого поведения является то, что
bash
считает, что подсказка длиннее, чем на самом деле. В качестве простого примера, если использовать один:Предполагается, что подсказка состоит из 8 символов, а не 1. Таким образом, если окно терминала состоит из 20 столбцов, то после ввода 12 символов оно считается 20 и переворачивается. Это также очевидно, если затем попытаться сделать возврат или Ctrl+u. Он останавливается на колонке 9.
Однако он также не начинает новую строку, если только она не находится в последнем столбце, в результате первая строка перезаписывается.
Если вы продолжаете печатать, строка должна переноситься на следующую строку после 32 символов.
источник
В основном это связано с тем, что размер окна, принятый терминалом, не совпадает с фактическим размером окна. Если вы используете Bash, вы можете попробовать это.
Если вы не получите
Затем активируйте его с помощью
Затем просто попробуйте запустить другую команду (например
ls
) или изменить размер окна один раз, вышеописанное работает для меня каждый раз.В частности, для систем Redhat проблема часто возникает из-за неправильной настройки,
~/.bashrc
чтобы не вызывать/etc/bashrc
. Обычно bash загружает~/.bashrc
ожидаемый вызов/etc/bashrc
, который по умолчанию содержитshopt -s checkwinsize
.источник
/etc/bashrc
, все остальное было в порядке ... оказывается, это является причиной проблем с упаковкой.shopt -s checkwinsize
в сеансе SSH. Но упаковка сохраняется.Как упоминалось в других ответах, непечатаемые последовательности, такие как,
\e[0;30m
должны быть обернуты\[...\]
.Кроме того (и то , что я не вижу , упоминается еще) это , кажется , что
\r\n
должно быть вне из\[...\]
если у вас есть многострочный запрос на. Мне понадобилось несколько проб и ошибок, чтобы наконец понять это.источник
Однажды я где-то читал (не знаю где), что использую,
\001
а\002
не могу\[
и\]
могу решить эту проблему. Это для меня.Кстати, определение PS1 не должно выглядеть уродливо.
источник
Это звучит как проблема с настройками переменных
COLUMNS
&LINES
environment. Когда вы изменяете размер окна, они обычно устанавливаются автоматически с помощью gnome-терминала (я полагаю), вы можете принудительно установить их вручную, введя командуresize
.пример
Если я изменю размер моего gnome-терминала на 79x17, мои переменные будут выглядеть так:
Я могу заставить это так:
источник
Чтобы предотвратить перенос, вы также можете увеличить количество столбцов, используя, например,
источник
Также та же проблема может быть вызвана использованием широких символов Юникода (например, https://stackoverflow.com/a/34812608/1657819 ). Вот фрагмент кода, вызывающий проблему (обратите внимание на
$Green
и$Red
правильно экранированные строки цвета):Bash не может правильно рассчитать длину, поэтому самым простым способом может быть экранирование двух из трех частей этих широких символов.
источник
\001
и\002
.