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

87

Что-то, что я заметил в Ubuntu в течение долгого времени, которое меня разочаровывало, когда я набираю команду в командной строке, которая становится длиннее (шире), чем ширина терминала, вместо того, чтобы переносить на новую строку, это возвращается к столбцу 1 в той же строке и начинает перезаписывать начало моей командной строки. (На самом деле она не перезаписывает фактическую команду, но визуально она переписывает текст, который был отображен).

Трудно объяснить, не видя этого, но предположим, что мой терминал шириной 20 символов (Mine больше похож на 120 символов, но для примера), и я хочу повторить английский алфавит. То, что я печатаю, это:

echo abcdefghijklmnopqrstuvwxyz

Но мой терминал выглядит так, как только я нажимаю клавишу:

pqrstuvwxyzghijklmno

Когда я нажимаю enter, это echos

abcdefghijklmnopqrstuvwxyz

, поэтому я знаю, что команда была получена должным образом. Это просто завернуло мою запись после «o» и началось с той же строки.

Что бы я ожидал, если бы я набрал эту команду на терминале шириной всего 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 (если только Мне нужно внести некоторые изменения в конфигурацию)

У кого-нибудь еще была эта проблема, и может ли кто-нибудь подумать, как ее исправить?

Edit

Это был мой .bashrc-файл. Я скопировал один и тот же профиль с машины на машину, и я использовал специальные символы в моем PS1, которые каким-то образом отбрасывают его. Я теперь придерживаюсь стандартных переменных bash для моего PS1.

Благодаря @ ændrük для подсказки на .bashrc!

... End Edit ...

    
задан BrianH 01.02.2011 в 21:17
источник

6 ответов

54

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

Просто убедитесь, что у вас \[ внутри вашей PS1 , предшествующей вашему цвету.

Например:

PS1='\[\e[0;32m\[email protected]\w/:\[\e[m '
    
ответ дан user10070 02.02.2011 в 08:06
источник
114

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

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

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

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

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\]>'

См. Ссылка , а также Ссылка для получения дополнительной информации о tput .

    
ответ дан geirha 02.02.2011 в 09:00
8

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

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

COLUMNS=250

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

    
ответ дан Deboshree 17.04.2012 в 12:58
5

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

    
ответ дан reentim 06.05.2012 в 06:20
0

Простейшей задачей было бы добавить следующую строку перед настройкой PS1:

stty columns 1000

Например,

stty columns 1000
PS1='\[\e[0;32m\[email protected]\w/:[\e[m '

однако это влияет на другие команды unix, такие как ls и man.

    
ответ дан Gennady 12.02.2013 в 16:27
0

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

Итак, проверьте все остановленные интерактивные подсказки.

    
ответ дан Ciprian Tomoiagă 07.04.2017 в 22:39