Объедините 2 подсказки в один, показывая состояние ошибки в красном / оранжевом

Не очень интересный вопрос, но ответ может быть полезен для многих пользователей. 😉

Как и все, у меня есть настраиваемая подсказка. Моя ручка красная для корня и зеленая для обычного пользователя и несколько других мелких вещей:

В bash.bashrc :

 PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\n\$ ' 

В .bashrc :

 PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1" 

в результате чего:

 \[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\n\$ 

для обычного пользователя …

Речь идет о максимуме моих способностей с подсказками, но действительно администратор высокого уровня поделился своим приглашением со мной:

 PS1_Error="\[\033[31;1m\]" PS1_Normal="\[\033[0m\]" PS1_Inside='${debian_chroot:+($debian_chroot)}\u@\h:\w$bad\$ ' PS1="\` retcode=\$? ; if [ 0 -ne \$retcode ]; then bad=\" [\\\\\\\$?=\$retcode]\" echo \"$PS1_Error$PS1_Inside$PS1_Normal\" else bad=''; echo \"$PS1_Inside\"; fi; \`" unset PS1_Error PS1_Normal PS1_Inside 

который имеет фантастическую возможность повернуть красный цвет с ошибкой и отобразить номер ошибки !

Поскольку я слишком глуп, чтобы даже понять, как это работает (необходимые переменные не заданы), я определенно слишком глуп, чтобы включить его в мой (и я бы хотел, чтобы оранжевый был для условия ошибки …)

Поскольку администратор высокого уровня является действительно занятым парнем / девушкой / средним человеком, я спрашиваю о U & L, если кто-то здесь понимает выше и хочет научить меня, как ловить рыбу, а не давать мне рыбу? помогите мне включить хороший PS1 в тупой и немного объяснить, что здесь происходит?

  • Выделите текущую строку подсказки bash
  • Вызов Bash: использование \ в PROMPT_COMMAND
  • как заставить команду tcsh promt показать количество заданий LSF?
  • Вход Bash в той же строке
  • скрипт bash не создает псевдоним и не обновляет $ PS1
  • Печать (сохранение) последней команды ввода bash
  • Какому потоку Bash пишет свое приглашение?
  • Пользовательское приглашение bash - проблема позиционирования курсора
  • One Solution collect form web for “Объедините 2 подсказки в один, показывая состояние ошибки в красном / оранжевом”

    Эти переменные описывают сам запрос:

     PS1_Error="\[\033[31;1m\]" PS1_Normal="\[\033[0m\]" PS1_Inside='${debian_chroot:+($debian_chroot)}\u@\h:\w$bad\$ ' 

    Цвета выполняются с помощью управляющих кодов ANSI . \033 – это escape-символ (33 = 27 октал), затем [31;1m устанавливает цвет текста 31 и эффект 1. [0m устанавливает эффект 0, т.е. все значения по умолчанию. Обратите внимание, что PS1_Inside находится в одинарных кавычках ( '' ), это означает, что на этом этапе не выполняется замена переменных. (Это произойдет позже).

    Здесь происходит настоящая магия:

     PS1="\` ... \`" 

    Это устанавливает PS1 на вывод выполнения кода внутри символов `` . Переменное расширение произойдет с тем, что выйдет. Код запускается каждый раз, когда отображается приглашение . Сам код работает следующим образом:

      retcode=\$? ; 

    $? содержит результат предыдущей команды. Zero означает «ОК», все остальное – условие отказа. В настоящее время это сохраняется в режиме retcode . Все должно быть экранировано, потому что мы хотим, чтобы переменные были доступны при запуске кода, а не во время определения.

      if [ 0 -ne \$retcode ]; then 

    Если это не ноль, что-то пошло не так. Поэтому мы повторяем стиль приглашения, используемый для ошибок. bad используется в PS1_Inside выше. PS1_Error используется для изменения цвета, PS1_Normal используется для изменения цвета в нормальном режиме.

      bad=\" [\\\\\\\$?=\$retcode]\" echo \"$PS1_Error$PS1_Inside$PS1_Normal\" else 

    В этом случае ошибки не было, поэтому мы не делаем никаких цветов и просто PS1_Inside . bad установлен на пустой, поэтому в подсказке ничего не появится.

      bad=''; echo \"$PS1_Inside\"; fi; 

    Наконец, вспомогательные переменные не настроены, чтобы не загромождать окружающую среду.

     unset PS1_Error PS1_Normal PS1_Inside 
    Linux и Unix - лучшая ОС в мире.