Prompt

BASH:如何將退出程式碼保存在 PS1 中以便以後在 PS1 中使用?

  • October 27, 2018

我正在嘗試通過以下方式自定義我的 PS1(我已經刪除了顏色):

PS1='\u@\h:\w$(git_branch)$(useExitCode)\$ '

在哪裡

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

至於退出狀態,我想在函式執行把它撿起來,在. 我怎樣才能做到這一點?後一個函式可能如下所示:git_branch``useExitCode

useExitCode()
{
   local exitCode=${1}

   if [[ ${exitCode} == 0 ]]; then
       echo ':)'
   else
       echo ':('
   fi
}

問題是,如何將退出程式碼儲存在 PS1 中並稍後使用?

像下面這樣的東西不起作用,但給出了大方向的想法:

PS1='exitCode=$?\u@\h:\w$(git_branch)$(useExitCode ${exitCode})\$ '

上面的回顯是“exitCode=0”(或=1)部分,但它沒有被儲存,因此在稍後呼叫“${exitCode}”時它是空的。

我會為此使用PROMPT_COMMAND變數:

PROMPT_COMMAND='lstatus=$?'
PS1='$(false)$(exit 3)<$lstatus> '

<0> sh -c 'exit 17'
<17> echo $?
17
<0>

bash(1)手冊頁:

PROMPT_COMMAND 如果設置,則在發出每個主要提示之前將該值作為命令執行。

我對我的提示做了類似的事情,這就是我如何去“git在我的提示中獲取分支,同時仍然顯示最後一個命令的退出程式碼”的事情:

parse_git_branch() {
    exit_code=$?
    local stdcolor
    local branchcolor
    local lines
    stdcolor="^[[0;32m"
    if [[ -d ./.git ]] || $( git status > /dev/null 2>&1 ); then
       lines=$(git status -s | wc -l)
       if [[ 0 -eq ${lines} ]]; then
          # Working copy is clean
          branchcolor="^[[1;32m"
       elif git status -s 2> /dev/null | grep -q '^A'; then
          # If we have staged commits waiting, red; else yellow
          branchcolor="^[[1;31m"
       else
          branchcolor="^[[1;33m"
       fi
       git branch 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/ $stdcolor($branchcolor\1$stdcolor)/"
    fi
    return $exit_code
 }
 export PS1='\[\e]0;\u@\h: \w\a\]\[\e[38;5;14m\]\u\[\e[38;5;8m\]@\[\e[38;5;6m\]\h\[\e[38;5;8m\]:\[\e[38;5;10m\]\w'"\$(parse_git_branch) \e[31m\${?##0}\n"'\[\e[$(((($?>0))*31))m\]\$\[\e[0m\] '

(經過清理的)結果提示及其在git工作區中的外觀:

me@host:~/src/project (devel)
$ false
me@host:~/src/project (devel)  1
$ true
me@host:~/src/project (devel) 
$

這一切的結果是:

  • 如果我在git工作區中,則會顯示我目前的分支。綠色表示乾淨,黃色表示臟,紅色表示有暫存文件等待送出
  • 如果最後一個命令的退出程式碼不為零,它會在提示符中顯示(紅色),我仍然可以訪問$?.

引用自:https://unix.stackexchange.com/questions/477848