Bash и Zsh запрашивают звонок и отображают код ошибки последней команды - PullRequest
0 голосов
/ 20 февраля 2020

Я хочу получить одно и то же приглашение в Bash и Zsh. И я хочу, чтобы он:

  • звонил, если последняя команда не выполнена, и
  • отображает код ошибки.

В Bash , У меня есть:

BLK="\[$(tput setaf 0; tput bold)\]"
RED="\[$(tput setaf 1; tput bold)\]"
grn="\[$(tput setaf 2)\]"
GRN="\[$(tput setaf 2; tput bold)\]"
yel="\[$(tput setaf 3)\]"
reset_color="\[$(tput sgr0)\]"

PS1='\n\
`if [[ $? -gt 0 ]]; then printf "\[\033[01;31m\]$?"; tput bel; else printf "\[\033[01;32m\]0"; fi`\
\[\033]0;$PWD\007\] \
\[\033[0;32m\]\u@\h\
\[\033[01;30m\]:\
\[\033[;;33m\]\w\
\[\033[36m\]`__git_ps1`\
\[\033[0m\]\n$ '

В Zsh, это моя конфигурация:

BLK=$(tput setaf 0; tput bold)
RED=$(tput setaf 1; tput bold)
grn=$(tput setaf 2)
GRN=$(tput setaf 2; tput bold)
yel=$(tput setaf 3)
reset_color=$(tput sgr0)

PROMPT="
%(?.$GRN.$RED)%?$reset_color $grn%n@%m$BLK:$reset_color$yel%~ $reset_color
%(!.#.$) "

И вот как это выглядит в терминале:

enter image description here

Обе подсказки звонят в звонок при возникновении ошибки с последней командой. Но в Bash выводит 0 вместо правильного кода возврата команды, которая не прошла.

Как это исправить?

PS- Любой лучший способ улучшить вышеуказанный код приветствуется!

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

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

PS1='\n\
$(st=$?; if [[ $st -gt 0 ]]; then printf "\[\033[01;31m\]$st"; tput bel; else printf "\[\033[01;32m\]0"; fi)\
\[\033]0;$PWD\007\] \
\[\033[0;32m\]\u@\h\
\[\033[01;30m\]:\
\[\033[;;33m\]\w\
\[\033[36m\]`__git_ps1`\
\[\033[0m\]\n$ '

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

set_title () {
    printf '\033]0;%s%s' "$1" "$(tput bel)"
}

make_prompt () {
  local st c bell
  bell=$(tput bel)
  st=$?

  # Green for success, red and a bell for failure
  if [[ $st -gt 0 ]]; then
    c=31
  else
    c=32 bell=
  fi

  win_title=$(set_title "$PWD")
  git_status=$(__git_ps1)

  PS1="\n"
  PS1+="\[\e[01;${c}m$bell\]"  # exit status color and bell
  PS1+=$st
  PS1+="\[$win_title\]"  # Set the title of the window
  PS1+="\[\e[0;32m\]"    # Color for user and host
  PS1+="\u@\h"
  PS1+="\[\e[01;30m\]"   # Color for : separator
  PS1+=":"
  PS1+="\[\e[;;33m\]"    # Color for directory
  PS1+="\w"
  PS1+="\[\e[36m\]"      # Color for git branch
  PS1+=$git_status
  PS1+="\[\e[0m\]"       # Reset to terminal defaults
  PS1+="\n$ "
}

PROMPT_COMMAND=make_prompt

zsh уже имеет терминальную агенцию c escape-последовательности для добавление цвета.

PROMPT="%B%(?.%F{green}.%F{red}$(tput bel))%?%f%b %F{green}%n@%m%F{black}%B:%b%F{yellow}%~ %f%(!.#.$) "
1 голос
/ 20 февраля 2020

Любая внешняя команда (например, printf или tput) сбрасывает значение $?. Вам нужно записать его в переменную до того, как это произойдет.

rc=$?
if [ $rc -gt 0 ]; then
  printf "\[\033[01;31m\]$rc"
  tput bel
else
  printf "\[\033[01;32m\]0"
fi

(Развернутый для удобочитаемости; он заменит код внутри обратных галочек.)

Обратите внимание, что это все равно будет перезаписывать значение $?; возможно, добавьте exit $? в конце, чтобы правильно сохранить значение.

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