Как __git_ps1 обновляет приглашение bash? - PullRequest
0 голосов
/ 31 мая 2019

Я пользователь Windows с оболочкой Git Bash в качестве ежедневного драйвера.Мне любопытно, как функция __ git_ps1 обновляет приглашение каждый раз, когда вы меняете каталог.Это действительно единственный пример обновления приглашения bash на лету, который я видел.Я хочу использовать это поведение в своей собственной функции, чтобы добавить отображение в моем приглашении, если у меня открыт сеанс RDP.

tldr : Любые идеи о том, как функция __git_ps1 оценивает приглашение bash на лету ????

Итак, вот моя простая функция, чтобы увидеть, является ли клиент RDP

function __rdp_ps1() {
  local MATCH=
  if tasklist | grep --quiet mstsc; then
    MATCH="\e[41mRDP\e[0m"
  fi
  echo "$MATCH"
}

Итак, идея в том, что я хочу отображать RDP с красным фоном, и я хочу, чтобы моя оболочка оценивала это на лету так же, как это может __git__ps1.

То, что я исследовал (без реального успеха) до сих пор

/etc/profile.d/git-prompt.sh

Кажется, этот блок создает PS1, который использует моя оболочка

    PS1='\[\033]0;$TITLEPREFIX:$PWD\007\]' # set window title
    PS1="$PS1"'\n'                 # new line
    PS1="$PS1"'\[\033[32m\]'       # change to green
    PS1="$PS1"'\u@\h '             # user@host<space>
    PS1="$PS1"'\[\033[35m\]'       # change to purple
    PS1="$PS1"'$MSYSTEM '          # show MSYSTEM
    PS1="$PS1"'\[\033[33m\]'       # change to brownish yellow
    PS1="$PS1"'\w'                 # current working directory
    if test -z "$WINELOADERNOEXEC"
    then
        GIT_EXEC_PATH="$(git --exec-path 2>/dev/null)"
        COMPLETION_PATH="${GIT_EXEC_PATH%/libexec/git-core}"
        COMPLETION_PATH="${COMPLETION_PATH%/lib/git-core}"
        COMPLETION_PATH="$COMPLETION_PATH/share/git/completion"
        if test -f "$COMPLETION_PATH/git-prompt.sh"
        then
            . "$COMPLETION_PATH/git-completion.bash"
            . "$COMPLETION_PATH/git-prompt.sh"
            PS1="$PS1"'\[\033[36m\]'  # change color to cyan

# пробовал hamjamming PS1 = "$ PS1` __rdp_ps1` "здесь, это работает только при входе в систему

            PS1="$PS1"'`__git_ps1`'   # bash function
        fi
    fi
    PS1="$PS1"'\[\033[0m\]'        # change color
    PS1="$PS1"'\n'                 # new line
    PS1="$PS1"'$ '                 # prompt: always $

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

/etc/bash.bashrc

Последняя строка содержит золото

# Fixup git-bash in non login env
shopt -q login_shell || . /etc/profile.d/git-prompt.sh`

Так что я оценил shopt login_shell и он всегда включен, но я действительно не знаю, что это значит, потому что комментарий заставляет меня поверить, что, когда env входа в систему выключен, сценарий подсказки будет оцененТед

Есть идеи ???

Ответы [ 2 ]

1 голос
/ 01 июня 2019

Ваша проблема может заключаться в том, что вы определяете $PS1 с помощью двойных кавычек, которые интерпретирует bash при выполнении.Это означает, что __rdp_ps1 запускается, когда определено $PS1.

В вашем .bashrc попробуйте заменить определение на:

PS1='$PS1 `__rdp_ps1`' # Note the single quote. 

У меня есть аналогичная функция на моем PS1(но для отображения количества заданий в фоновом режиме), вот полная версия (доступна здесь: https://github.com/padawin/dotfiles/blob/master/.bashrc#L70):

function j(){
    jobs | wc -l | egrep -v ^0 | sed -r 's/^([0-9]+)/ (\1)/'
}

PROMPT_COMMAND=__prompt_command # Func to gen PS1 after CMDs

__prompt_command() {
    local EXIT="$?" # This needs to be first
    PS1="$(virtual_env_name)"

    local RCol='\[\e[0m\]'

    local Red='\e[0;31m'
    local Gre='\e[0;32m'
    local Blu='\e[1;34m'

    PS1+="${Gre}\u@\h$(j)${RCol}: ${Red}\w${Blu}$(__git_ps1)"
    if [ $EXIT != 0 ]; then
        PS1+="$Red \342\234\226 (${EXIT})"
    else
        PS1+="$Gre \342\234\224"
    fi
    PS1+="$RCol\n> "
}

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

function j(){
    jobs | wc -l | egrep -v ^0 | sed -r 's/^([0-9]+)/ (\1)/'
}

PS1='\u$(j) > ' # Note the single quote here

Который ведет себя следующим образом:

padawin > vim

[1]+  Stopped                 vim
padawin (1) > fg
vim
padawin > 
0 голосов
/ 25 июня 2019

То, что вы ищете, это PROMPT_COMMAND.Bash выполнит все, что находится там, перед отображением приглашения.Если ваша PS1 обновляется на лету, у вас, вероятно, уже есть PROMPT_COMMAND.

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