让BASH用得更舒服:提示符颜色、时间、显示返回值、终端标题显示当前目录与正在执行的命令
BASH的PS1
变量控制提示符相关的东西,善用它可以让BASH用起来舒服很多
- 提示符颜色
- 提示符显示上一个命令的返回值(exit code),并根据是否0调整颜色
- 提示符生成的时间(这样就知道上一条命令是什么时候执行完成的,执行时间长的任务时有用)
你有没有遇到过,打开了很多个终端窗口,分不清哪个用于哪个?同样是通过PS1
可以做到
- 终端窗口标题显示当前目录
- 终端窗口标题显示当前正在执行的命令
效果图(不含时间):
- 提示符前面的
( 0)
是上一个命令的返回值。 - 第二个数字是当前BASH进程的PID。
- 窗口标题显示有当前目录,和终端类型。
- 当有命令在执行时,窗口标题显示正在执行的命令
- exit code正常返回0,显示白色,若非0显示红色
实现方法
代码放入~/.bashrc
中,BASH启动时会执行。
首先准备不可打印字符
np1="\[" #不可打印字符开始
np2="\]" #不可打印字符结束
准备颜色
c0="$np1""\e[0m""$np2" #默认颜色
c1="$np1""\e[0;92m""$np2" #绿
c2="$np1""\e[1;93m""$np2" #黄 加粗
c3="$np1""\e[0;91m""$np2" #红
c4="$np1""\e[0;93m""$np2" #黄
颜色值可以去查相应的表。
提示符要显示的一般内容
h1="$$-\u@\h:" # PID-用户名@机器名:
h2="\w " # pwd
h3="\$ " # $
给它们配上颜色放入提示符中
PS1="${c1}${h1}${c2}${h2}${c3}${h3}${c0}"
上一个命令的返回值
last_exit_code="\$(LEC=\$? ; if [[ \$LEC -ne 0 ]]; then echo -n '\[\e[0;91m\]' ; fi ; printf \"(%3d)\" \$LEC) "
用$?
取得上一个命令的返回值。这条总体有点复杂,里面包含了多条语句,包含了对值的判断以决定颜色。注意BASH中单引号引起来的字符串是不能使用转义字符的。
终端窗口标题显示当前目录
if [[ $TERM =~ "xterm" || $TERM =~ "rxvt" ]]; then #先判断一下终端类型,也可以不判断
t1="\e]0;"
t2="\w" # pwd
t3=" 终端 $TERM" #终端类型
t4="\a"
fi
放入PS1
中
"${np1}${t1}${t2}${t3}${t4}${np2}"
终端窗口标题显示当前存在执行的命令
用trap 调试命令 DEBUG
设置在执行命令时,自动执行的调试命令,以设置窗口标题为${BASH_COMMAND}
if [[ $TERM =~ "xterm" || $TERM =~ "rxvt" ]]; then
trap 'echo -ne "\033]0;" ; echo -n "${BASH_COMMAND}" ; echo -ne " 正在执行\007" > /dev/stderr' DEBUG
fi
提示符生成的时间
prompt_time="\$(date +%H:%M:%S) "
完整代码
将以上所述结合起来,放入~/.bashrc
中就可以实现开头描述的所有功能啦!
np1="\[" #不可打印字符开始
np2="\]" #不可打印字符结束
c0="$np1""\e[0m""$np2" #默认颜色
c1="$np1""\e[0;92m""$np2" #绿
c2="$np1""\e[1;93m""$np2" #黄 加粗
c3="$np1""\e[0;91m""$np2" #红
c4="$np1""\e[0;93m""$np2" #黄
h1="$$-\u@\h:" # PID-用户名@机器名:
h2="\w " # pwd
h3="\$ " # $
if [[ $TERM =~ "xterm" || $TERM =~ "rxvt" ]]; then
# 平时不执行命令时的标题
t1="\e]0;"
t2="\w" # pwd
t3=" 终端 $TERM" # 终端类型
t4="\a"
fi
last_exit_code="\$(LEC=\$? ; if [[ \$LEC -ne 0 ]]; then echo -n '\[\e[0;91m\]' ; fi ; printf \"(%3d)\" \$LEC) "
prompt_time="\$(date +%H:%M:%S) "
PS1="${np1}${t1}${t2}${t3}${t4}${np2}${last_exit_code}${c0}${prompt_time}${c1}${h1}${c2}${h2}${c3}${h3}${c0}"
if [[ $TERM =~ "xterm" || $TERM =~ "rxvt" ]]; then
trap 'echo -ne "\033]0;" ; echo -n "${BASH_COMMAND}" ; echo -ne " 正在执行\007" > /dev/stderr' DEBUG
fi
关注一下
📺 Bilibili 收集有趣科技 和发布原创视频 | 🖥️ Github 有用的和没用的开源项目代码
玩而后赏
子曰,玩而予赏,善莫大焉?
又曰,玩而不赏,良心安焉?
写作不易,感谢支持!
虽然,小小玩意,不足挂齿;
亦是,卅年老刀,献丑于此。
其实,多赏非求,少许亦可。
进者,参观主页,玩物更多。
如果本文帮到你,请点一下”推荐“,谢谢!
版权所有 本博客文章皆属原创(除特别标明外)
未联系作者获得同意前,不可转载
转载必须附上源地址,并连我博客上的宣传内容一并转载
未联系作者获得同意前,不可转载
转载必须附上源地址,并连我博客上的宣传内容一并转载