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。
归档时间: |
|
查看次数: |
906 次 |
最近记录: |