fer*_*lin 57 linux bash prompt
所以,我一直在尝试通过bash提示进行自定义,以便它看起来像
[feralin@localhost ~]$ _
Run Code Online (Sandbox Code Playgroud)
与颜色.我设法得到恒定的颜色(每次看到提示时颜色相同)但我希望用户名('feralin')显示为红色,而不是绿色,如果最后一个命令具有非零退出状态.我提出了:
\e[1;33m[$(if [[ $? == 0 ]]; then echo "\e[0;31m"; else echo "\e[0;32m"; fi)\u\e[m@\e[1;34m\h \e[0;35m\W\e[1;33m]$ \e[m
Run Code Online (Sandbox Code Playgroud)
但是,根据我的观察,$(if ...; fi)似乎在.bashrc运行时评估一次,结果在之后永远被替换.这使得名称始终为绿色,即使最后一个退出代码非零(如,echo $?).这是发生了什么?或者我的提示是否只是其他错误?长问题简介,我如何获得使用最后退出代码的提示?
dem*_*ure 98
当您开始在复杂的PS1上边界时,您可以考虑使用PROMPT_COMMAND.
有了这个,你将它设置为一个函数,它将在每个命令后运行以生成提示.
您可以尝试以下内容 ~/.bashrc
PROMPT_COMMAND=__prompt_command # Func to gen PS1 after CMDs
__prompt_command() {
local EXIT="$?" # This needs to be first
PS1=""
local RCol='\[\e[0m\]'
local Red='\[\e[0;31m\]'
local Gre='\[\e[0;32m\]'
local BYel='\[\e[1;33m\]'
local BBlu='\[\e[1;34m\]'
local Pur='\[\e[0;35m\]'
if [ $EXIT != 0 ]; then
PS1+="${Red}\u${RCol}" # Add red if exit code non 0
else
PS1+="${Gre}\u${RCol}"
fi
PS1+="${RCol}@${BBlu}\h ${Pur}\W${BYel}$ ${RCol}"
}
Run Code Online (Sandbox Code Playgroud)
这应该做你想要的声音.如果你想看看我用我的函数做的所有事情,看看我的bashrc的子文件__prompt_command.
hel*_*ios 16
如果您不想使用prompt命令,则需要考虑两件事:
使用变量的工作示例
PS1="\$(VALU="\$?" ; echo \$VALU ; date ; if [ \$VALU == 0 ]; then echo zero; else echo nonzero; fi) "
Run Code Online (Sandbox Code Playgroud)
没有变量的工作示例
这里的if必须是第一件事,在任何覆盖它的命令之前$?.
PS1="\$(if [ \$? == 0 ]; then echo zero; else echo nonzero; fi) "
Run Code Online (Sandbox Code Playgroud)
注意如何\$()转义,因此它不会立即执行,但每次使用PS1时都会执行.也是所有的用途\$?
Ale*_*hek 11
紧凑型解决方案:
PS1='... $(code=${?##0};echo ${code:+[error: ${code}]})'
Run Code Online (Sandbox Code Playgroud)
这种方法不需要PROMPT_COMMAND(显然这有时会更慢),并且[error: <code>]如果退出代码非零则打印,如果为零则不打印任何内容:
... > false
... [error: 1]> true
... >
Run Code Online (Sandbox Code Playgroud)
[error: ${code}]根据您的喜好更改部分,并${code}作为要打印的非零代码。
请注意,使用 来'确保$()稍后评估 PS1 时(而不是启动 shell 时)执行内联 shell。
\e[01;31m作为奖励,您可以通过在前面和后面添加重置来使其变为红色\e[00m:
PS1='... \e[01;31m$(code=${?##0};echo ${code:+[error: ${code}]})\e[00m'
Run Code Online (Sandbox Code Playgroud)
--
怎么运行的:
${?##0}退出代码$?##删除任何模式,有效地使结果成为一个空变量(感谢@blaskovicz的技巧)00code变量,因为我们需要进行另一次替换,并且它们不能嵌套${code:+REPLACEMENT}打印该部分REPLACEMENTcode[error: ${code}]我想保留默认的Debian颜色,打印确切的代码,并且只在失败时打印它:
# Show exit status on failure.
PROMPT_COMMAND=__prompt_command
__prompt_command() {
local curr_exit="$?"
local BRed='\[\e[0;91m\]'
local RCol='\[\e[0m\]'
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
if [ "$curr_exit" != 0 ]; then
PS1="[${BRed}$curr_exit${RCol}]$PS1"
fi
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25043 次 |
| 最近记录: |