Что-то, что я заметил в Ubuntu в течение долгого времени, меня расстраивало, когда я набираю команду в командной строке, которая становится длиннее (шире) ширины терминала, вместо переноса на новую строку, она возвращается к столбец 1 в той же строке и начинает перезаписывать начало моей командной строки. (На самом деле она не перезаписывает действительную команду, но визуально она перезаписывает отображаемый текст).
Трудно объяснить, не видя этого, но, скажем, мой терминал был 20 символов в ширину (мой больше похож на 120 символов - но для примера), и я хочу повторить английский алфавит. Что я печатаю это:
echo abcdefghijklmnopqrstuvwxyz
Но как выглядит мой терминал перед нажатием клавиши:
pqrstuvwxyzghijklmno
Когда я нажимаю войти, это эхо
abcdefghijklmnopqrstuvwxyz
поэтому я знаю, что команда была получена правильно. Это просто обернуло мое печатание после «о» и началось с той же строки.
Что бы я ожидал, если бы я набрал эту команду на терминале шириной всего 20 символов, это было бы так:
echo abcdefghijklmno
pqrstuvwxyz
Справочная информация: я использую bash в качестве оболочки, и у меня есть эта строка в моем ~ / .bashrc:
set -o vi
чтобы иметь возможность перемещаться по командной строке с помощью команд VI. В настоящее время я использую сервер Ubuntu 10.10 и подключаюсь к серверу с помощью Putty.
В любой другой среде, в которой я работал, если я наберу длинную командную строку, она добавит новую строку под строкой, над которой я работаю, когда моя команда становится длиннее, чем ширина терминала, и когда я продолжаю печатать, я вижу свою команду на 2 разные строки. Но насколько я помню, используя Ubuntu, мои длинные команды занимают только одну строку.
Это также происходит, когда я возвращаюсь к предыдущим командам в истории (я нажимаю клавишу Esc, затем «K», чтобы вернуться к предыдущим командам) - когда я получаю предыдущую команду, длина которой была больше ширины терминала, командная строка получает покалеченный, и я не могу сказать, где я в команде.
Единственный обходной путь, который я нашел, чтобы увидеть всю длинную команду, - это нажать «Esc-V», которая открывает текущую команду в редакторе VI.
Я не думаю, что у меня есть что-то странное в моем файле .bashrc. Я закомментировал строку "set -o vi", и у меня все еще была проблема.
Я скачал свежую копию Putty и не внес никаких изменений в конфигурацию - я просто набрал имя хоста для подключения, и у меня все еще есть проблема, поэтому я не думаю, что это что-то с Putty (если мне не нужно внести некоторые изменения в конфигурацию)
У кого-нибудь еще была такая проблема, и может кто-нибудь подумать, как ее исправить?
редактировать
Это был мой файл .bashrc. Я скопировал один и тот же профиль с машины на машину, и я использовал специальные символы в моем $ PS1, которые каким-то образом выбрасывают его. Теперь я придерживаюсь стандартных переменных bash для моего $ PS1.
Спасибо @ ændrük за подсказку .bashrc!
... Конец редактирования ...
источник
/etc/skel/.bashrc
. Имейте в виду, что вам нужно будет повторно подключиться, чтобы изменения вступили в силу, и обязательно сохраните резервную копию своего собственного .bashrc.tput smam
Ответы:
Убедитесь, что все непечатаемые байты в вашем PS1 содержатся внутри
\[ \]
. В противном случае, bash посчитает их по длине подсказки. Он использует длину приглашения, чтобы определить, когда переносить строку.Например, здесь bash считает подсказку шириной 19 столбцов, тогда как подсказка, отображаемая терминалом, имеет ширину всего 10 колонок (
My prompt
написана голубым и>
написана цветом по умолчанию):в то время как здесь он только подсчитывает приглашение как 10 столбцов шириной, потому что игнорирует байты между специальным
\[
и\]
escape-символами:Однако, для хорошей практики, используйте
tput
для генерации экранирования терминала, а не для их жесткого кодирования:См. Http://mywiki.wooledge.org/BashFAQ/053 , а также http://wiki.bash-hackers.org/scripting/terminalcodes для получения дополнительной информации
tput
.источник
PS1='...'
: почему одинарные кавычки не препятствуют$cyan
и не$reset
заменяют?$cyan
и$reset
заменяют, ноPS1
оцениваются каждый раз, когда приглашение печатается. Вы можете увидеть это, попробовав,PS1='$var> '
а затем присвоитьvar
различные значения и посмотреть, как меняется подсказка. Затем попытайтесьPS1="$var> "
заметить, что приглашение остается статичным;$var
расширился во время задания, не каждый разPS1
оценивается.PS1=${PS1}"\e]2;$@\a"
. Я пыталсяPS1=${PS1}"\[\e]2;\]$@\[\a\]"
Я полагаю, вы настроили свои
PS1
цвета, верно?Просто убедитесь, что у вас
\[
внутриPS1
цитаты, предшествующей вашему набору цветовНапример:
источник
export PS1='^[[96m'$(hostname)'<^[[92m${PWD}^[[96m>^[[97m '
- я давно его использую - он совместим с KSH ...\[
в начале и\]
в конце.\\[
была опечаткой, вызванной редактированием. Я исправил это.У меня была похожая проблема, и я наконец нашел простое решение.
Добавьте следующую строку в ваш
.bashrc
файл:Затем введите,
source ~/.bashrc
чтобы получить желаемый эффект.источник
source .bashrc
. Ваша подсказка будет обновлена немедленноsetwinsize
набора для моего bash, поэтому он не обновлял COLUMNS правильно, см. Unix.stackexchange.com/a/167911/8337export COLUMNS=250
последовал за нимexport TERM=xterm
и был счастлив.У меня была та же проблема с настраиваемым цветным приглашением, хотя я содержал цветовые коды внутри
\[
и\]
разделители. Оказывается, что у bash есть проблемы с отображением цветов внутри функции . Я просто использовал переменные для моего приглашения, и хотя мой .bashrc немного менее элегантен, теперь все работает хорошо.источник
Чтобы сделать PS1, нужно добавить следующую строку:
Например,
однако это влияет на другие команды Unix, такие как ls и man.
источник
У меня была эта проблема при подключении в tmux. Проблема была в том, что у меня был
ipython
сеанс в фоновом режиме (ctrl + z
), и это как-то нарушало перенос строк. Как только я прекратил (fg
,ctrl+d+d
) мой терминал начал работать должным образомПоэтому проверяйте, не остановились ли интерактивные подсказки.
источник
Так что у меня возникла та же проблема с небольшим поворотом, и я подумал, что тоже поделюсь своим решением, просто чтобы добавить свой маленький нюанс: D
Мой начальный PS1 был
Проблема была в том, что я пытался изменить заголовок своего терминала, а также командную строку. То , как я сделал это, добавив
\[\033]0;\]Title\a
к PS1 переменной.Так что теперь мой PS1 был:
Это испортило мне черту. Я наконец понял, что bash, похоже, не нравится
\a
в конце. Чтобы обойти это, я поместил заголовок в переменную, которая, казалось, исправила это.источник
\[
и\]
не работал на меня. Я думаю, что-то отличалось в том, как я генерировал приглашение (из внешней программы), или потому что мое приглашение было «динамическим».После прочтения этого я обнаружил , что вы можете избежать цветовых кодов с
0x01
и0x02
байтов.Например, я использую специальную версию Chalk и оборачиваю цвета, используя это:
источник