我已将最后一个命令的返回值添加到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
系统范围内导出。