Как получить длинные командные строки для переноса на следующую строку?

Что-то, что я заметил в 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!

... Конец редактирования ...

122
задан 19 October 2015 в 12:31

8 ответов

Убедитесь, что все непечатаемые байты в PS1 содержатся в пределах \ [\] . В противном случае bash будет считать их по длине приглашения. Он использует длину приглашения, чтобы определить, когда следует обернуть строку.

Например, здесь bash считает приглашение шириной 19 столбцов, в то время как приглашение, отображаемое терминалом, имеет ширину всего 10 столбцов ( My prompt написано голубым, и > написано цветом по умолчанию):

PS1='\e[36mMy prompt\e[0m>'         # bash count: 19, actual: 10

в то время как здесь он считает приглашение только как 10 столбцов шириной, потому что оно игнорирует байты между специальными \ [ и \] экранирования:

PS1='\[\e[36m\]My prompt\[\e[0m\]>' # bash count: 10, actual: 10

Однако для хорошей практики используйте tput для генерации экранирования терминала, а не жестко их кодируйте:

cyan=$(tput setaf 6) # \e[36m
reset=$(tput sgr0)   # \e[0m
PS1='\[$cyan\]My prompt\[$reset\]>'

См. http: // mywiki .wooledge.org / BashFAQ / 053 , а также http://wiki.bash-hackers.org/scripting/terminalcodes для получения дополнительной информации о tput .

153
ответ дан 19 October 2015 в 12:31

Жөнөкөй нерсе, PS1 орнотуудан мурун төмөнкү сапты кошуу болот:

stty columns 1000

Мисалы,

stty columns 1000
PS1='\[\e[0;32m\u@\w/:[\e[m '

бирок бул ls жана man сыяктуу башка уникс буйруктарына таасир этет.

3
ответ дан 19 October 2015 в 12:31

У меня возникла эта проблема при подключении через tmux. Проблема заключалась в том, что у меня был сеанс ipython в фоновом режиме ( ctrl + z ), и это каким-то образом нарушало перенос строк. Как только я его прервал ( fg , ctrl + d + d ), мой терминал начал работать правильно

Так что проверьте все остановленные интерактивные запросы.

0
ответ дан 19 October 2015 в 12:31

Я думаю, вы настроили свой PS1 с цветами, верно?

Просто убедитесь, что у вас есть \ [ внутри вашего Цитата PS1 перед вашим набором цветов

Например:

PS1='\[\e[0;32m\u@\w/:\[\e[m '
60
ответ дан 19 October 2015 в 12:31

У меня была аналогичная проблема, и я наконец нашел простое решение.

Добавьте следующую строку в свой файл .bashrc :

COLUMNS=250

Затем введите source ~ / .bashrc , чтобы получить желаемый эффект.

13
ответ дан 19 October 2015 в 12:31

У меня была такая же проблема с пользовательской цветной подсказкой, хотя я содержал цветовые коды в разделителях \ [ и \] . Оказывается, bash имеет проблемы с отображением цветов изнутри функции . В итоге я просто использовал переменные для своего приглашения, и хотя мой .bashrc немного менее элегантен, теперь все работает нормально.

5
ответ дан 19 October 2015 в 12:31

Итак, у меня была такая же проблема с небольшим закручиванием , и я подумал, что тоже поделюсь своим решением, просто чтобы добавить свой небольшой нюанс: D

Мой первоначальный PS1 был

PS1="\[\033[01;32m\]\u\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$"

. Проблема заключалась в том, что я пытался изменить название моего терминала , а также командную строку. Я сделал это, добавив \ [\ 033] 0; \] Title \ a к переменной PS1 .

Итак, теперь мой PS1 был:

PS1="\[\033[01;32m\]\u\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$\[\033]0;\]Title\a"

Это испортил мне перенос строки. Я наконец понял, что bash, похоже, не любит иметь в конце \ a . Чтобы обойти это, я поместил заголовок в переменную, которая, казалось, исправила его.

TITLE="\033]0;Title\a"
PS1="\[\033[01;32m\]\u\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$\[$TITLE\]"
0
ответ дан 19 October 2015 в 12:31

\ [ и \] у меня не работали. Я предполагаю, что было что-то другое в том, как я генерировал приглашение (из внешней программы), или потому что мое приглашение было «динамическим».

После прочтения этого я обнаружил, что вы действительно можете избежать цвета коды с байтами 0x01 и 0x02 .

например Я использую специальную версию Chalk и оборачиваю цвета следующим образом:

const Chalk = require('@nasc/chalk');

const chalk = new Chalk.constructor({
  wrapper: {
    pre: '\1',
    post: '\2',
  }
});
0
ответ дан 19 October 2015 в 12:31

Другие вопросы по тегам:

Похожие вопросы: