Mic*_*eon 11 shell bash prompt
我已将最后一个命令的返回值添加到PS1我的.bashrc.
现在我只想在值不为零时才显示它。
Android 的外壳有它:
${| local e=$? (( e )) && REPLY+="$e|" return $e }
Run Code Online (Sandbox Code Playgroud)
问题:如何将其转换为 bash?
Qua*_*odo 15
PS1='${?#0}$ '
Run Code Online (Sandbox Code Playgroud)
它使用了一种特殊形式的参数扩展, ${?#0},这意味着:“如果它是${?}前一个命令的退出代码的第一个字符,则删除字符零。”
如果最后一个退出代码不为零,您还可以更改提示的颜色:
PS1='\[\e[0;$(($?==0?0:91))m\]$ \[\e[0m\]'
Run Code Online (Sandbox Code Playgroud)
如果最后一个命令以非零退出,则使用if-else 三元表达式 $(($?==0?0:91))生成颜色代码0;91m(红色,请参阅颜色代码),否则0;0m(您的默认颜色)。
这是我在我的.bashrc:
PS1_PROMPT() {
local e=$?
(( e )) && printf "$e|"
return $e
}
PS1='$(PS1_PROMPT)'"$PS1"
Run Code Online (Sandbox Code Playgroud)
ibug@example:~ $ false
1|ibug@example:~ $ ^C
130|ibug@exame:~ $ true
ibug@example:~ $
Run Code Online (Sandbox Code Playgroud)
与 JoL 的答案相比,这具有优势,即 的值$?在显示后保留(通过return $e)。它也基本上是对 Android 的默认设置的返工,/system/etc/mkshrc可以完成相同的工作。
请注意,$(PS1_PROMPT)被括在单引号,因为$PS1被评估每它的印刷时间中,除了当集的变量赋值表达式,所以单引号防止它被evaluted到现在打印时,相反该推迟到。
或者,根据 ilkkachu 的建议,您可以使用 BashPROMPT_COMMAND特殊变量:
PS1_PROMPT() {
local e=$?
PROMPT_ECODE=
(( e )) && PROMPT_ECODE="$e|"
return $e
}
PROMPT_COMMAND=PS1_PROMPT
PS1='$PROMPT_ECODE'"$PS1"
Run Code Online (Sandbox Code Playgroud)
这有一个优点,即每次打印 PS1 时都不会产生子外壳。
整个AndroidPS1是:
${|
local e=$?
(( e )) && REPLY+="$e|"
return $e
}$HOSTNAME:${PWD:-?} $
Run Code Online (Sandbox Code Playgroud)
我不认识${|,但这个 bash 是等效的:
PS1='$(e=$?; (( e )) && echo "$e|")$HOSTNAME:${PWD:-?} $ '
Run Code Online (Sandbox Code Playgroud)
local不需要,因为它$()是一个子 shell。