• 让BASH用得更舒服:提示符颜色、时间、显示返回值、终端标题显示当前目录与正在执行的命令


    BASH的PS1变量控制提示符相关的东西,善用它可以让BASH用起来舒服很多

    • 提示符颜色
    • 提示符显示上一个命令的返回值(exit code),并根据是否0调整颜色
    • 提示符生成的时间(这样就知道上一条命令是什么时候执行完成的,执行时间长的任务时有用)

    你有没有遇到过,打开了很多个终端窗口,分不清哪个用于哪个?同样是通过PS1可以做到

    • 终端窗口标题显示当前目录
    • 终端窗口标题显示当前正在执行的命令

    效果图(不含时间):

    1. 提示符前面的( 0)是上一个命令的返回值。
    2. 第二个数字是当前BASH进程的PID。
    3. 窗口标题显示有当前目录,和终端类型。
    4. 当有命令在执行时,窗口标题显示正在执行的命令
    5. 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 "33]0;" ; echo -n "${BASH_COMMAND}" ; echo -ne "  正在执行07" > /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 "33]0;" ; echo -n "${BASH_COMMAND}" ; echo -ne " 正在执行07" > /dev/stderr' DEBUG fi
    如果本文帮到你,请点一下”推荐“,谢谢!
    版权所有 本博客文章皆属原创(除特别标明外)
    未联系作者获得同意前,不可转载
    转载必须附上源地址,并连我博客上的宣传内容一并转载

    打赏作者

    写作不易,感谢支持!
    打赏链接
    

  • 相关阅读:
    sum left join 多次引发的问题
    WPF之Binding基础三 Binding的路径Path
    解决Android Studio启动不了的办法
    指向常量的指针和常量指针的区别简单理解
    简单的字符串操作
    QT问答
    log4qt使用示例
    在线代码库
    Qt5的windows开放环境准备
    QT 调试技术
  • 原文地址:https://www.cnblogs.com/garyw/p/12769261.html
Copyright © 2020-2023  润新知