Проблема обвинчивания строк оболочки
Я сделал что-то, чтобы разорвать мою 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 там для информации, я не изменил его с установки по умолчанию. Если я полностью удалю цветовые коды, тогда все будет хорошо, любые идеи?
Ответы
Ответ 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\]"