如果返回错误,则在 Bash 提示符中显示最后一个命令的退出代码

如果返回错误,则在 Bash 提示符中显示最后一个命令的退出代码

我已将最后一个命令的返回值添加到PS1我的.bashrc.

现在我想仅在值非零时才显示它。

Android 的 shell 有:

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

问题:如何将其转换为bash?

答案1

PS1='${?#0}$ '

它使用一种特殊的形式参数扩展, ${?#0},表示:“如果字符零是${?}上一个命令的退出代码 的第一个字符,则删除该字符。”

如果最后的退出代码不为零,您还可以更改提示的颜色:

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

迅速的

这使用了一个if-else 三元表达式 $(($?==0?0:91))这使得颜色代码0;91m(红色,参见颜色代码)如果最后一个命令以非零值退出,或者0;0m(您的默认颜色)否则。

答案2

这是我用什么在我的.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 的答案有一个优点,即显示后保留的值(通过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 时都不会生成子 shell。

答案3

整个AndroidPS1是:

${|
    local e=$?

    (( e )) && REPLY+="$e|"

    return $e
}$HOSTNAME:${PWD:-?} $ 

我不认识${|,但这个 bash 是等效的:

PS1='$(e=$?; (( e )) && echo "$e|")$HOSTNAME:${PWD:-?} $ '

local不需要,因为$()它是一个子 shell。

答案4

谢谢大家,我的决定是这样的:

PS1_PROMPT() {
  local e=$?
  #(( e )) && printf "$e|" # BW
  (( e )) && printf "\033[01;31m$e\033[00m|"  # color
  return $e
}
PS1='$(PS1_PROMPT)'"$PS1"

如果 errno(又名 $?)不为 0,则显示为红色。

请注意,在 .bashrc 中找到的条件"$color_prompt" = yes不能在上面使用,因为函数 PS1_PROMPT() 不是在 .bashrc 中计算,而是每次在提示符中计算。我不想在$color_prompt系统范围内导出。

相关内容