内容提要:
主要是通过~/.bash_profile文件更改环境变量PS1,修改命令行提示符的显示格式,并展示不同颜色。
本文介绍了默认设置的缺陷,以及需要用到的基础知识,最后介绍了更改命令行提示符格式的具体方法:
1.默认设置的缺陷
我的mac终端的设置风格是Basic,字体是Menlo Regular 13 pt., 我敲打命令时它的显示如下:
Sheron-lvdeMacBook-Pro:~ sheron_lv$ cd codeLv/ Sheron-lvdeMacBook-Pro:codeLv sheron_lv$ ls JsHtml android ios java myweb Sheron-lvdeMacBook-Pro:codeLv sheron_lv$ cd ios Sheron-lvdeMacBook-Pro:ios sheron_lv$ ls crm-apollo-swift iphone-nova crm-mobile-hybrid-ios iphone-nova-merchant Sheron-lvdeMacBook-Pro:ios sheron_lv$
这样在查找上面的命令时,比较困难,整个屏幕都是一个颜色。
2. 基础知识
(1)mac中的一个重要的配置文件:
/etc/profile: 每个用户登录时都会运行的环境变量设置.
~/.bash_profile: 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,它设置一些环境变量。
(2)要修改命令行提示符,我们通过环境变量PS1来达到目的。
命令列表的参数:
\u 显示当前用户的用户名(user name)
\h 显示主机名(host name)
\W 显示当前工作目录的名字(work directory)
\$ 显示$符作为提示符,如果用户是root的话,则显示#号
(3)文本终端的颜色可以使用“ANSI非常规字符序列”来生成
“\033”引导非常规字符序列
“m”意味着设置属性然后结束非常规字符序列
编码 颜色/动作
0 重新设置属性到缺省设置
33 设置棕色前景
34 设置蓝色前景
36 设置青色前景
(4)通过上面的介绍,我们查看一下当前的PS1,就能看懂了:
Sheron-lvdeMacBook-Pro:ios sheron_lv$ $echo echo $PS1 \h:\W \u\$
很简单,格式"\h:\W \u\$",代表的是:"主机名:目录 用户名$"
3.更改命令行提示符格式的具体方法
(1)修改一下当前hostname,我之前起的名字太繁琐了:“Sheron-lvdeMacBook-Pro”,太长了,看着很烦
查看hostname命令:
Sheron-lvdeMacBook-Pro:etc sheron_lv$ hostname Sheron-lvdeMacBook-Pro.local
修改hostname:打开系统偏好设置 - 共享, 修改计算机名字,我就修改简单点儿,叫“MacLv”好了。
(2)修改命令提示符格式为[user@hostname] currentpath $
根据上面2(2)的基础知识介绍,我们可以在~/.bash_profile文件中修改PS1的代码:
export PS1='[\u@\h] \W\$ '
现在命令提示符的格式效果变成这样的了:
[sheron_lv@MacLv] ~ $
看着清爽了很多。
(3)增加些颜色
根据上面2(2)的基础知识介绍,我们可以更改~/.bash_profile文件中PS1的代码:
export PS1='\033[01;33m\][\u@\h ]\033[01;34m\]\W \[\033[01;36m\]\$\[\033[00m\] '
此时效果如下:
这样查历史命令就能方便点了,可能我设置的颜色比较不中看,你可以根据ANSI非常规字符序列不同的编码设置自己喜欢的效果。
上面是单步讲解,可以把~/.bash_profile文件直接改为以下内容:
#enables colorin the terminal bash shell export CLICOLOR=1 #sets up thecolor scheme for list export LSCOLORS=gxfxcxdxbxegedabagacad #sets up theprompt color (currently a green similar to linux terminal) export PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$ ' #enables colorfor iTerm exportTERM=xterm-color PATH="/usr/local/mysql/bin:${PATH}" export PATH export DYLD_LIBRARY_PATH=/usr/local/mysql/lib/ export VERSIONER_PYTHON_PREFER_64_BIT=yes export VERSIONER_PYTHON_PREFER_32_BIT=no [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*
我使用的Linux发行版是LinuxMint 17.2 Rafaela,默认情况下Terminal中的shell提示包括了用户名、主机名、当前目录(绝对路径)和提示符。这样会导致当进入一个比较深的目录时,提示符太长(如下图所示),操作起来就不太方便了。
我们可以自定义Linux系统终端提示符。Linux系统终端提示符的特征由系统环境变量PS1(是“prompt string one” 的简写)定义。通过命令echo $PS1查看当前设置。从上图可以看到我的Linux机器上该环境变量PS1的值。下面我们通过改变环境变量PS1的值来将shell提示符设置得更加清爽点。
1.基本转义字符
PS1的值由一系列静态文本或\和转义字符序列组成,如:
$ PS1=”\u@\H \w$ ”
表1: Shell 提示符中用到的转义字符
序列 |
显示值 |
\a |
以 ASCII 格式编码的铃声 . 当遇到这个转义序列时,计算机会发出嗡嗡的响声。 |
\d |
以日,月,天格式来表示当前日期。例如,“Mon May 26” |
\h |
本地机的主机名,但不带末尾的域名。 |
\H |
完整的主机名。 |
\j |
运行在当前 shell 会话中的工作数。 |
\l |
当前终端设备名。 |
\n |
一个换行符。 |
\r |
一个回车符。 |
\s |
shell 程序名。 |
\t |
以24小时制,hours:minutes:seconds 的格式表示当前时间. |
\T |
以12小时制表示当前时间。 |
\@ |
以12小时制,AM/PM 格式来表示当前时间,例如“10:51 PM”。 |
\A |
以24小时制,hours:minutes 格式表示当前时间。 |
\u |
当前用户名。 |
\v |
shell 程序的版本号,例如4.3。 |
\V |
shell 程序的版本号,例如4.3.11。 |
\w |
当前工作目录名。 |
\W |
当前工作目录名的最后部分。 |
\! |
当前命令的历史号。 |
\# |
当前 shell 会话中的命令数。 |
\$ |
这会显示一个"$"字符,除非你拥有超级用户权限。在那种情况下, 它会显示一个"#"字符。 |
\[ |
标志着一系列一个或多个非打印字符的开始。这被用来嵌入非打印的控制字符,这些字符以某种方式来操作终端仿真器,比方说移动光标或者是更改文本颜色。 |
\] |
标志着非打印字符序列结束。 |
例如我现在想让提示符显示格式为:“<用户名>@<当前目录名> $ ”,则
$ PS1=”\u@\W\$ ”
效果如下所示,
上面能够满足我们的效果了,但是相对于LinuxMint原始的提示符,缺少了颜色,不太美观。下面我们来学习如何添加颜色。大多数终端仿真器程序支持一定的非打印字符序列来控制,比方说字符属性(像颜色,黑体和可怕的闪烁) 和光标位置。
2.字体颜色
字体颜色是由一个ANSI 转义编码来控制的。该控制编码会嵌入字符流中并发送给终端仿真器。但是,该控制编码不会被“打印”到屏幕上,而是会被终端解释为一个指令。正如我们在上表看到的字符序列, 这个 \[ 和 \] 序列被用来封装这些非打印字符。一个 ANSI 转义编码以一个八进制033(这个编码是由 退出按键产生的)开头,其后跟着一个可选的字符属性(0:正常、1:黑体、4:下划线、5:闪烁、7:反向(前景色和背景色反转)),在之后是一个指令。
表14-2: 用转义序列来设置文本颜色
序列 |
文本颜色 |
序列 |
文本颜色 |
\033[0;30m |
黑色 |
\033[1;30m |
深灰色 |
\033[0;31m |
红色 |
\033[1;31m |
浅红色 |
\033[0;32m |
绿色 |
\033[1;32m |
浅绿色 |
\033[0;33m |
棕色 |
\033[1;33m |
黄色 |
\033[0;34m |
蓝色 |
\033[1;34m |
浅蓝色 |
\033[0;35m |
粉红 |
\033[1;35m |
浅粉色 |
\033[0;36m |
青色 |
\033[1;36m |
浅青色 |
\033[0;37m |
浅灰色 |
\033[1;37m |
白色 |
例如我们来设置一个同LinuxMint默认的绿色提示符,
$ PS1="\[\033[01;32m\]\u@\W\$\[\033[00m\] "
于是,我们便有了下面的效果。
上面跟设置的提示符格式中的最后那个”\[\033[00m\]”是用于将后续的字符颜色还原回原来的颜色。如果没有没有加最后这个转义码,则会出现下面结果(我们自己手工输入的命令也都将是绿色的)。
3.背景颜色
除了字体颜色,我们也可以设置字体的背景颜色。同样是通过转义的控制编码来实现,下表是背景颜色的控制编码。
表3: 用转义序列来设置背景颜色
\033[0;40m |
黑色 |
\033[1;44m |
蓝色 |
\033[0;41m |
红色 |
\033[1;45m |
粉红 |
\033[0;42m |
绿色 |
\033[1;46m |
青色 |
\033[0;43m |
棕色 |
\033[1;47m |
浅灰色 |
4.移动光标:
转义编码也可以用来定位光标。这些编码通常被用来,每次当提示符出现的时候,会在屏幕的不同位置,比如说上面一个角落,显示一个时钟或者其它一些信息。下表是一系列用来定位光标的转义编码:
表14-4: 光标移动转义序列
转义编码 |
行动 |
\033[l;cH |
把光标移到第 l 行,第 c 列。 |
\033[nA |
把光标向上移动 n 行。 |
\033[nB |
把光标向下移动 n 行。 |
\033[nC |
把光标向前移动 n 个字符。 |
\033[nD |
把光标向后移动 n 个字符。 |
\033[2J |
清空屏幕,把光标移到左上角(第零行,第零列)。 |
\033[K |
清空从光标位置到当前行末的内容。 |
\033[s |
存储当前光标位置。 |
\033[u |
唤醒之前存储的光标位置。 |
5.保存提示符
我们在当前打开的Terminal中设置环境变量PS1的值来自定义的终端提示符,只在当前Terminal中有效,打开新的Terminal就会采用系统默认的提示符了。我们当让不希望每次打开Terminal的时候都要重新设置一次SP1环境变量。
~/.bashrc文件会在每次打开一个Terminal之前会被执行一次。于是,我们可以将设置环境变量SP1的命令放到该文件中,便不需要每次都手工再设置一次SP1的值。于是,我们在~/.bashrc配置文件末尾加入下面两行内容,
PS1="\[\033[01;32m\]\u@\W\$\[\033[00m\] " export PS1
于是,每次打开Terminal便都会有如下提示符效果,
6.示例
(1)格式:“<用户名>@<当前目录名>$”
$ PS1="\u@\W\$ "
效果如下:
(2)添加下划线:
$ PS1="\[\033[4;37m\]\u@\W\$\[\033[00m\] "
效果如下:
(3)前景色为绿色:
$ PS1="\[\033[0;32m\]\u@\W\$\[\033[00m\] "
效果如下:
(4)前景色为绿色,背景色为红色:
$ PS1="\[\033[0;41m\033[1;32m\]\u@\W\$\[\033[00m\] "
效果如下:
(5)设置一个超级复杂的,通过移动光标来设置一个每次显示提示符的时候都在当前Terminal的第一行显示当前时间。
$ PS1='\[\033[s\033[0;0H\033[0;41m\033[K\033[1;33m\t\033[0m\033[u\033[1;32m\]\u@\W\$ \[\033[00m\] '
效果如下: