命令行配置相关信息,以便更友好的支持git相关命令的显示;
PS1
Bash,[Unix shell](https://baike.baidu.com/item/Unix shell)的一种,是一个命令处理器,通常运行于文本窗口中,并能执行用户直接输入的命令;还能从脚本文件中读取命令并执行。
Bash有四个可以自定义的提示符变量
| PS1 | 交互式脚本等待用户输入时的提示信息 |
| PS2 | 一条命令没有结束的时候的连接性的提示(比如使用\将一行复杂的命令使用多行连接起来的场合),默认是'> '符号 |
| PS3 | 和select命令结合使用,使用较少 |
| PS4 | 调试时的行前显示内容,使用较少 |
通过调整PS1变量,可以配置相关的提示信息
转义字符
输出提示符时,Bash 会查找一些反斜杠开头的字符,然后转义成特殊字符。
| \d | 日期,格式为weekday month date,例如:"Mon Aug 1" |
| \H | 完整的主机名称 |
| \h | 包含.的情况下取第一个字段 |
| \t | 显示时间为24小时格式,如:HH:MM:SS |
| \T | 显示时间为12小时格式 |
| \A | 显示时间为24小时格式:HH:MM |
| \u | #当前用户的账号名称 |
| \v | BASH的版本信息 |
| \w | 完整的工作目录名称 |
| \W | 利用basename取得工作目录名称,所以只会列出最后一个目录 |
| $ | 提示字符,如果是root时,提示符为:# ,普通用户则为:$ |
| \nnn | 使用八进制表示的ASCII,比如\a也可以表现为\007 |
| \e | 转义(033)(比如进行颜色设定) |
| ! | 当前命令在历史命令缓冲区中的序号 |
| # | 命令编号, 从1开始(!是在history的位置) |
还有其他一些使用较少的转义字符,就不一一列出了
颜色
在PS1中设置字符颜色的格式为:\[\e[I;F;Bm\]........\[\e[0m\],
F为字体颜色,编号为30-37B为背景颜色,编号为40-47I为特殊效果,(这个字母代号是我自己随便写的,没找到官方对应的字母代号)\[\e[0m\]表示颜色设定的结束(\e等价于\033)F,B,I三个设置信息没有顺序要求,可以随便写
具体颜色值含义如下
| 字体颜色编号 | 背景颜色编号 | 颜色 |
|---|---|---|
| 30 | 40 | 黑色 |
| 31 | 41 | 红色 |
| 32 | 42 | 绿色 |
| 33 | 43 | 黄色 |
| 34 | 44 | 蓝色 |
| 35 | 45 | 紫色 |
| 36 | 46 | 青色 |
| 37 | 47 | 白色 |
除了能设置颜色,还可以设置一些特殊的展示效果,具体如下:
| 效果编号 | 效果 |
|---|---|
| 0 | OFF |
| 1 | 高亮显示 |
| 4 | underline |
| 5 | 闪烁 |
| 7 | 反白显示 |
| 8 | 不可见 |
自己的配置如下:
export PS1='\[\e[1;35m\][\u@xiaoshuai:\[\e[36m\]/\W \[\e[1;35m\]\t]\$\[\e[0m\]'
在~/.bash_profile文件中写入上述命令,并执行 source ~/.bash_profile 即可生效
Mac OSX 是 ~/.bash_profile文件,对应到Linux的话就是 ~/.bashrc 文件
Git支持
如果在命令行执行git命令,良好的提示信息也能提供很大的便利,列举以下几个自己使用的设置:
显示分支名
有几个点需要先声明以下
- 要显示分支名的话,需要调整PS1环境变量
- 设置PS1的
~/.bash_profile文件可以看做是一个shell脚本,不过不是用户执行的,可以在里面执行一些shell命令 - 展示分支名的思路,就是在
~/.bash_profile文件中编写函数,获取git项目的分支名,然后写到PS1环境变量中
获取git项目的分支名有多种方式,我这里只是列举两种,
git rev-parse --abbrev-ref HEAD
git symbolic-ref --short HEAD
然后修改~/.bash_profile文件如下:
#获取分支名并输出
function git_branch {
branch="`git rev-parse --abbrev-ref HEAD 2>/dev/null`"
if [ "${branch}" != "" ];then
echo "($branch)"
fi
}
#把分支名添加到PS1中
export PS1='\[\e[1;35m\][\u@xiaoshuai:\[\e[36m\]/\W\[\e[32m\]$(git_branch) \[\e[1;35m\]\t]\$\[\e[0m\]'
获取git分支名有多种方法,自行挑选一种实现即可,原理都是一样的。
分支的状态和颜色
目标是根据git分支不同的状态,来分别展示不同的颜色。
大概的思路,就是获取当前分支的状态,然后判断当前状态应该展示哪种颜色,输出到PS1变量中
git分支状态
通过git status 命令可以获取当前分支的状态,一个常见的输出示例如下:
On branch release
Your branch is up to date with 'origin/release'.
nothing to commit, working tree clean
对于某个固定状态,最后一行文本的输出是固定的,所以只需要关注最后一行输出即可。找到所有可能的输出,针对每个输出都设置对应的颜色,就能实现预期的功能。
#Git branch status
function git_status {
local unknown untracked stash clean ahead behind staged dirty diverged
unknown='1;36' # cyan
untracked='1;31' # red
stash='1;32' # green
clean='1;32' # green
ahead='1;33' # yellow
behind='1;33' # yellow
staged='1;34' # blue
dirty='1;31' # red
diverged='1;31' # red
branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
if [[ -n "$branch" ]]; then
if [[ "$branch" == 'HEAD' ]]; then
branch=$(git rev-parse --short HEAD 2>/dev/null)
fi
git_status=$(git status 2> /dev/null)
# If nothing changes the color, we can spot unhandled cases.
color=$unknown
if [[ $git_status =~ 'Untracked files' ]]; then
color=$untracked
branch="${branch}+"
fi
if git stash show &>/dev/null; then
color=$stash
branch="${branch}*"
fi
if [[ $git_status =~ 'working directory clean' ]]; then
color=$clean
fi
if [[ $git_status =~ 'Your branch is ahead' ]]; then
color=$ahead
branch="${branch}"
fi
if [[ $git_status =~ 'Your branch is behind' ]]; then
color=$behind
branch="${branch}"
fi
if [[ $git_status =~ 'Changes to be committed' ]]; then
color=$staged
fi
if [[ $git_status =~ 'Changed but not updated' ||
$git_status =~ 'Changes not staged' ||
$git_status =~ 'Unmerged paths' ]]; then
color=$dirty
fi
if [[ $git_status =~ 'Your branch'.+diverged ]]; then
color=$diverged
branch="${branch}!"
fi
printf "\e[%sm%s" "$color" "($branch)"
fi
return 0
}
export PS1='\[\e[1;35m\][\u@xiaoshuai:\[\e[36m\]/\W$(git_status) \[\e[1;35m\]\t]\$\[\e[0m\]'
脚本逻辑比较简单,可以根据个人喜好,调整各种状态的颜色。
自动补全分支名
自动补全分支名这个功能,就依赖git官方的一个脚本了,也是网上能找到的通用方法
#1. 获取官方脚本
git clone https://github.com/git/git.git 或者 git clone git@github.com:git/git.git
contrib/completion/git-completion.bash 自动补全脚本
#2. 把该脚本专门存储一下
cp git-completion.bash ~/.git-completion.bash
#3. 修改 ~/.bash_profile 文件,添加下面一行
source ~/.git-completion.bash
如果不想clone整个项目,也可以直接copy对应脚本的内容,粘贴到本地,https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash
这个脚本内容很多,有3000多行,感兴趣的话可以自行研究一下,通过最前面的注释,可以了解到,这个脚本支持这些信息的自动补齐
- branch 名字
- tag 名字
- file 名字
- Git 的子命令
- emain 信息
- tree paths
- file paths
- common --long-options
这些支持也足够平时的使用了
官方脚本中的 contrib/completion/git-prompt.sh 文件,支持高亮显示当前分支名称,
本地存储该文件 cp git-prompt.sh ~/.git-prompt.sh
修改 ~/.bash_profile 文件,添加下面这些内容# git显示分支官方实现 GIT_PS1_SHOWDIRTYSTATE=true GIT_PS1_SHOWCOLORHINTS=true GIT_PS1_SHOWSTASHSTATE=true GIT_PS1_SHOWUNTRACKEDFILES=true #GIT_PS1_SHOWUPSTREAM=auto if [ -f ~/.git-completion.bash ]; then source ~/.git-prompt.sh PROMPT_COMMAND='__git_ps1 "[\t][\u@\h:\w]" "\\\$ "' fi