Bash

如果返回錯誤,則在 Bash 提示符中顯示最後一個命令的退出程式碼

  • June 14, 2021

我已將最後一個命令的返回值添加到PS1我的.bashrc.

現在我想讓它僅在值非零時顯示。

Android的shell有它:

${| local e=$? (( e )) && REPLY+="$e|" return $e }

**問題:**如何將其轉換為 bash?

PS1='${?#0}$ '

它使用了一種特殊形式的參數擴展, ${?#0},意思是:“如果它是 的第一個字元,則刪除字元零,${?}前一個命令的退出程式碼。”

如果最後一個退出程式碼不為零,您還可以更改提示的顏色:

PS1='\[\e[0;$(($?==0?0:91))m\]$ \[\e[0m\]'

迅速的

如果最後一個命令以非零退出,則使用if-else 三元表達式 $(($?==0?0:91))生成顏色程式碼0;91m(紅色,請參見顏色程式碼0;0m),否則(您的預設顏色)。

這是在我的.bashrc

PS1_PROMPT() {
 local e=$?
 (( e )) && printf "$e|"
 return $e
}
PS1='$(PS1_PROMPT)'"$PS1"
ibug@example:~ $ false
1|ibug@example:~ $ ^C
130|ibug@exame:~ $ true
ibug@example:~ $

與 JoL 的答案相比,這具有優勢,即$?在顯示 (via return $e) 後保留 的值。它基本上也是對 Android 預設設置的返工,/system/etc/mkshrc可以完成相同的工作。

請注意,$(PS1_PROMPT)它包含在單引號中,因為$PS1除了在變數賦值表達式中設置之外,每次列印時都會對其進行評估,因此單引號會阻止它立即被評估,而是將其推遲到列印時。

或者,正如 ilkkachu 所建議的,您可以使用 BashPROMPT_COMMAND特殊變數:

PS1_PROMPT() {
 local e=$?
 PROMPT_ECODE=
 (( e )) && PROMPT_ECODE="$e|"
 return $e
}
PROMPT_COMMAND=PS1_PROMPT
PS1='$PROMPT_ECODE'"$PS1"

這有一個優點,即每次列印 PS1 時都不會生成子外殼。

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