Почему эта подсказка bash работает странно / исчезает, и как я могу это исправить (OS X)? - PullRequest
11 голосов
/ 01 апреля 2009

Я допускаю, что использую несколько длинное приглашение bash:

--(username)-(Wed April 01|12:00:00)--(~ $

Недавно у меня появилась яркая идея изменить его так, чтобы в зависимости от значения выхода из предыдущей команды, в случае успеха, внутренние элементы () были бы зелеными, а в случае неудачи - красными. У меня это работает по большей части (некоторые странные состояния выхода изменят цвет на что-то другое, но я согласен с этим), но при вводе команды, которая состоит из более чем одной строки и вызывает прокрутку терминала, подсказка исчезает! Моя подсказка работала нормально, когда не было цвета, так что я предполагаю, что это связано с тем, что у меня не хватает цвета, и в особенности с моими незакрытыми [, но я не могу определить это.

#.profile
export PS1='--(\e[$((32-${?}))m\u\e[0m)-(\e[$((32-${?}))m\d\e[0m|\e[$((32-${?}))m\T\e[0m)--(\e[$((32-${?}))m\w\e[0m \$ '

Заранее спасибо!

Ответы [ 3 ]

35 голосов
/ 01 апреля 2009

Похоже, это должно решить вашу проблему.

Кажется, это работает для меня *:

export PS1='--(\[\e[$((32-${?}))m\]\u\[\e[0m\])-(\[\e[$((32-${?}))m\]\d\[\e[0m\]|\[\e[$((32-${?}))m\]\T\[\e[0m\])--(\[\e[$((32-${?}))m\]\w\[\e[0m\] \$ '

* ну, действительно export PS1='\u@\h:\w\$ ' у меня работает

Чтобы процитировать связанный пост, ответ заключается в добавлении \ [и \] вокруг всех ваших цветовых последовательностей в декларации PS1:

Раньше у меня было следующее значение для PS1:

'\ e [0; 34 м \ ч: \ w [!] \ $ \ E [0 м'

, который дал мне красивую синюю подсказку следующей формы

имя хоста: рабочий каталог [номер команды] $

Однако у меня была та же проблема с переносом строк, что и у вас. Исправление заключалось в том, чтобы вставить \ [и \] вокруг выходов ANSI, чтобы оболочка знала, что их не нужно включать в расчет переноса строк. Это приводит к следующему значению для PS1:

'\ [\ e [0; 34 м \] \ ч: \ w [!] \ $ \ [\ E [м \]'

6 голосов
/ 01 апреля 2009

http://mywiki.wooledge.org/BashFAQ/053 - У меня есть необычная подсказка с цветами, и теперь bash, похоже, не знает, насколько широк мой терминал. Линии неправильно оборачиваются.

Кстати; для вашей справки; вот мой PS1, который выглядит так: alt text
(источник: lyndir.com )

\[$reset$bold$green\]\u@\h\[$blue\] \W \[$red\]${?/#0/\[$green\]}\$\[$reset\]

Обратите внимание, как я поместил все цветовые коды в $parameters, чтобы сделать его более аккуратным, но что более важно, потому что вы должны использовать tput для их генерации . См:

http://mywiki.wooledge.org/BashFAQ/037 - Как печатать текст разными цветами?

Я объявляю свои параметры цвета в служебном скрипте, который получает my ~/.bashrc (и любые скрипты, которые я пишу), который называется bashlib.

На последней ноте; поместите ваше PS1 определение в ~/.bashrc и не export его. Нет абсолютно никакой причины, по которой вам следует добавлять определение PS1 в среду всех процессов, которые вы порождаете в своей оболочке.

1 голос
/ 03 апреля 2009

Похоже, вы просто пропускаете начальные и конечные скобки вокруг побегов (перед первым '\ e' и после последнего 'm'):

PS1='--(\[\e[$((32-${?}))m\u\e[0m)-(\e[$((32-${?}))m\d\e[0m|\e[$((32-${?}))m\T\e[0m)--(\e[$((32-${?}))m\w\e[0m\] \$ '

Как уже упоминалось, PS1 var не нужно экспортировать: его должна видеть только ваша оболочка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...