Подтвердить что ты не робот

Проблема обвинчивания строк оболочки

Я сделал что-то, чтобы разорвать мою Bash Shell Prompt в терминале OS X (10.5.7).

Это PS1, который я сконфигурировал:

PS1='\[\e[1;32m\]\h\[\e[0m\]:\[\e[1;34m\]\w\[\e[0m\]\$ '

Насколько я могу судить, я правильно выполнил команды цвета. Однако, когда я прокручиваю вверх и вниз в своей истории команд, я часто получаю проблемы с переносом строки, если исторические команды переносятся на несколько строк.

Я упростил свои подсказки к следующему:

PS1='\[\e[1m\]\h:\w\$ \[\e[0m\]'
PS2='> '

И я все еще вижу что-то вроде:

localhost:~/Library/Application Support/Firefox/Profiles/knpmxpup.Defau
lt/extensions/{1A2D0EC4-75F5-4c91-89C4-3656F6E44B68}$ expocd \{1A2D0EC4-7
5F5-4c91-89C4-3656F6E                                           export PS1="\[
\e[1;32m\]\h\[\e[0m\]:                                          cd Library/Appl
ication\ Support/

Я также пробовал \033 вместо \e. Я просто включил PS2 там для информации, я не изменил его с установки по умолчанию. Если я полностью удалю цветовые коды, тогда все будет хорошо, любые идеи?

4b9b3361

Ответ 1

Проблемы с переносом строк в Bash не новы. Обратитесь к списку рассылки, возможно, есть еще одна ошибка в этом отношении.

Вы не можете сделать больше, чем пометить непечатаемые символы, остальное должно быть сделано с помощью кода подсказки.

Ответ 2

Теперь я использую этот PS1 с хорошим эффектом:


green=$(tput setaf 2)
blue=$(tput setaf 4)
bold=$(tput bold)
reset=$(tput sgr0)
PS1='\[$green$bold\]\h\[$reset\]:\[$blue$bold\]\w\[$reset\]\$ '

Прокрутка по моей истории команд теперь обрабатывает переносы строк. Однако в то же время, поскольку этот вопрос был задан, я также обновил свою ОС X до 10.6.3

Ответ 3

fooobar.com/questions/153073/... кажется актуальным. Как заметил кто-то в этой теме, Bash FAQ на mywiki.wooledge.org обсуждает, как правильно указывать цветовые коды в приглашениях Bash (FAQ 53) и правильное обращение к цветам терминалов (FAQ 37).

Ответ 4

Здесь мой: это лучший, который я нашел, но сайт, на котором я изначально нашел его, отсутствовал escape-символ, что привело к проблеме переноса строки. Я возился с ним и, наконец, начал работать. Он показывает вашу информацию о пользователе, пути и филиале с хорошим контрастом, по цвету.

export PS1='\[\e[1;37m\]\[\e[1;32m\]\u\[\e[0;39m\]:\[\e[1;33m\]\w\[\e[0;39m\]\[\e[1;35m\]$(__git_ps1 " (%s)")\[\e[0;39m\] \[\e[1;37m\]|\[\e[0;39m\]\$'

Кроме того, добавьте

GIT_PS1_SHOWDIRTYSTATE=true

Чтобы показать маркер, когда ветка "грязная" (изменения должны быть зафиксированы)

export HISTCONTROL=ignoredups

Также полезно игнорировать дубликаты при прокрутке истории bash.

bind "set completion-ignore-case on" 

Помогает тоже.

Наконец,

shopt -s checkwinsize

Может быть полезно в OSX, если проблемы сохраняются.

Ответ 5

Кажется, что у вас есть правильно экранированные и закрытые последовательности.

Обходной путь, который я использую в любом случае, это добавить '\n' в конец. Я нахожу это более ясным и уменьшаю любую проблему с проблемами упаковки. Точный конец моего PS1:

'\n\[\033[0;30m\]$\[\033[0m\]

Отличный способ, которым вы, вероятно, знаете:

Bash подскажите, как

Ответ 6

Я заметил, что есть некоторые проблемы с позицией курсора подсказки, даже если в переменной PS1 или PROMPT нет специального символа.

Если мы выведем файл, который не имеет конца конца строки char в конце. Это смущает подсказку.

Вы можете воспроизвести это, выполнив:

curl https://gist.githubusercontent.com/martinos/d4aa0a7d4d752b0d0d9f/raw/3198c39f84a080c44227a084a19fb3a0bb661ee5/wrapping_issue.txt

и несколько раз нажимать клавишу вверх, и вы увидите, что запрос запутался.

Вы можете увидеть пример этого в действии:

https://asciinema.org/a/9mtjhi9dib6md4ocsbw210cca

Когда это произойдет, просто нажмите <CTRL-C>, и подсказка вернется к нормальной работе.

Обратите внимание на то, что ZShell не имеет этой проблемы.

Ответ 7

В будущем, это то, что я использую:

export PS1="\[\033[0;31m\][\[email protected]:\w]$\[\033[0m\] "

Это отобразит приглашение моей оболочки как:

[[email protected]:~]$

Помогает мне различать живые и dev-сайты.

Ответ 8

'shopt -s checkwinsize' также работает и для проблем с упаковкой Cygwin.

Ответ 9

Если вы используете трюк заголовка "\e]2;titlebar\a", убедитесь, что это тоже не удалось: "\[\e]2;titlebar\a\]"