Mac终端命令行提示符格式更改方法

内容提要:

主要是通过~/.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\] '

效果如下:

 

posted @ 2018-12-04 19:53  RyanJin  阅读(5575)  评论(15编辑  收藏  举报