Почему проверка состояния выхода в моей функции приглашения Bash также принимает значение true? - PullRequest
0 голосов
/ 08 мая 2019

Я новичок в командах и функциях bash. У меня есть две функции, и я пытаюсь отобразить их в моем терминале

git_branch()

и

highlightExitCode()

Здесь я хочу изменить настройку подсказки на export PS1 с этими двумя функциями. Я могу получить название ветви, а также смайлики из highlightExitCode(), но отображаемые смайлики всегда из другого и никогда не выполняются, если часть.

Может кто-нибудь сообщить мне, какую часть я здесь делаю неправильно.

export PS1='[\@][\u] [\W]$(git_branch) $(highlightExitCode)\$ '

git_branch() 
{
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}

highlightExitCode()
{
  exit_code=$?
  if [ $exit_code -ne 0 ]
    then
      echo -en '\xf0\x9f\x98\xb1 '
  else
    echo -en '\xf0\x9f\x98\x80 '
  fi
}

Ответы [ 2 ]

3 голосов
/ 09 мая 2019

highlightExitCode получает состояние завершения последнего запуска команды, равное git_branch при построении значения приглашения.

Вместо этого используйте PROMPT_COMMAND для динамического создания приглашения.В вашем файле .bashrc,

PROMPT_COMMAND=build_prompt

git_branch() 
{
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}

highlightExitCode()
{
  if [ "$1" -ne 0 ]; then
    echo -en '\xf0\x9f\x98\xb1 '
  else
    echo -en '\xf0\x9f\x98\x80 '
  fi
}

build_prompt () {
  last_exit=$?
  PS1='[\@][\u] [\W]'
  PS1+=$(git_branch)
  PS1+=" $(highlightExitCode "$last_exit")"
  PS1+='\$ '
}
0 голосов
/ 09 мая 2019

$? - это состояние выхода «последнего выполненного переднего конвейера». Поскольку вы всегда (успешно) запускаете git_branch прямо перед highlightExitCode, $? всегда равен 0. Ваше поведение примерно следующее:

$ exitcode() { (($? == 0)) && echo ":)" || echo ":("; }
$ PS1='$(exitcode) \$ '
:) $ false
:( $ true
:) $

, но с дополнительной командой как часть PS1.

Для этого вы можете сделать следующее:

  • Создайте эти три функции, например, как часть вашего ~/.bashrc:

    git_branch() {
        git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
    }
    
    smiley() {
        (($1 == 0)) &&  echo ':)' ||  echo ':('
    }
    
    set_prompt() {
        local exitstatus=$?
        PS1='$(git_branch) '"$(smiley "$exitstatus")"' \$ '
    }
    
  • Установите для переменной среды PROMPT_COMMAND значение set_prompt (возможно, также в ~/.bashrc)

Теперь у вас есть приглашение, которое ведет себя следующим образом:

(master) :) $ false
(master) :( $ true
(master) :) $

Основной трюк - сохранить статус выхода, который определяет поведение смайлика, прежде чем делать что-либо еще.


Кроме того, более чистый способ получения названия текущей ветви -

git symbolic-ref -q --short HEAD 2>/dev/null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...