Linux理念,提示符:PS1、PS2、PS3、PS4
Linux设计理念
1.一切皆文件:是 Unix/Linux 的基本理念之一。
2.单一用途的程序组成,保证linux内核的高效运行。
3.联接程序,共同完成复杂功能;保证简单功能的高效性,复杂的程序也必然是高效性的。
4.避免交互界面;通过简洁的命令行实现 排错,修改系统的配置,一切都是简洁明了为基础
5.提供机制,而非策略
6.Linux所有的配置信息都存放在文本文件中,修改配置只需修改其配置文件。
Linux作为自由软件(GNU),同时也遵循自由软件的思想:
自由使用
自由学习和修改
自由分发
自由创建衍生版
1、PS1——默认提示符
Linux下的默认提示符
我们通过修改,可以使其显示用户名、主机名和当前工作目录。
-bash-3.2$ export PS1="\u@\h \w> "
ramesh@dev-db ~> cd /etc/mail
ramesh@dev-db /etc/mail>
[注: 提示符修改为 "username@hostname current-dir>的形式]
本例中PS1使用的一些代码如下:
o \u -- 用户名
o \h -- 主机名
o \w -- 当前目录的完整路径。请注意当你在主目录下的时候,如上面所示只会显示~
注意,在PS1值之后有一个空格。从个人角度来讲,使用这个空格可以增加一定的可读性。
将export PS1=”\u@\h \w>" 添加到.bash_profile 或者 .bashrc中,则可以保证其永久有效。
ramesh@dev-db ~> vi ~/.bash_profile
ramesh@dev-db ~> vi ~/.bashrc
[注: 将命令添加到以上任何一个即可]
环境变量PS1(命令提示符),可以使用vi编辑/etc/profile文件,在最后加上:export PS1=’[u@h W]$ ‘即可,其中u显示当前用户账号,h显示当前主机名,W显示当前路径,$显示’$'符号
W 代替 w 就可以实现绝对路径到相对路径的转换
d :代表日期,格式为weekday month date,例如:”Mon Aug 1″
H :完整的主机名称。例如:我的机器名称为:fc4.linux,则这个名称就是fc4.linux
h :仅取主机的第一个名字,如上例,则为fc4,.linux则被省略
t :显示时间为24小时格式,如:HH:MM:SS
T :显示时间为12小时格式
A :显示时间为24小时格式:HH:MM
u :当前用户的账号名称
v :BASH的版本信息
w :完整的工作目录名称。家目录会以 ~代替
W :利用basename取得工作目录名称,所以只会列出最后一个目录
# :下达的第几个命令
$ :提示字符,如果是root时,提示符为:# ,普通用户则为:$
颜色设置
PS1=”e[1;32mue[me[1;33m@e[me[1;35mhe[m:w$ "
PS1="[\e[31m][\u@\h \W]\$[\e[0m]"
e[1;xxm和e[m就是改变终端字体颜色的部分,前者是修改颜色,后者是恢复到正常显示。但是 这时还会有问题,在提示符中输入第一行时,回车换行不正常,导致显示很混乱,因此,除了这个修改之外,还需要将全部非打印字符用专用的 bash 转义序列 "[" 和 "]” 括起来。这两个序列通知 bash,被括起来的字符不占用行 上的任何空间,这样就使自动换行能够继续正常工作。
最终版本如下(可解决带颜色提示符的不换行问题):
PS1=”[e[1;32m]u[e[m][e[1;33m]@[e[m][e[1;35m]h[e[m]:w$ “
其中,颜色表示为:30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white。
如果需要改变目录在命令行下显示颜色:
1、将/etc/DIR_COLORS文件cp到~/下,并改名为.dir_colors。
2、编辑.dir_colors文件,找到“DIR 01;34 # directory”,将34改为36。
你可以找到文件的两行注释:
# Text color codes:
# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
按照颜色对应的数字,你还可以把目录显示颜色改成其他的。
同样其他的显示效果(包括背景)也可以参照说明进行修改。
这样你就可以定制自己的linux下命令行方式下的个性化显示效果了。
3、重新登录,就可以看到修改后的效果了。
在Linux终端下调试程序时,有时需要输出大量信息。若能控制字体的颜色和显示方式,可使输出信息对比鲜明,便于调试时观察数据。
终端的字符颜色由转义序列(Escape Sequence)控制,是文本模式下的系统显示功能,与具体语言无关。
转义序列以控制字符'ESC'开头。该字符的ASCII码十进制表示为27,十六进制表示为0x1B,八进制表示为033。多数转义序列超过两个字符,故通常以'ESC'和左括号'['开头。该起始序列称为控制序列引导符(CSI,Control Sequence Intro),通常由'\033['或'\e['代替。
通过转义序列设置终端显示属性时,可采用以下格式:
\033[ Param {;Param;...}m 或 \e[ Param {;Param;...}m
其中,'\033['或'\e['引导转义序列,'m'表示设置属性并结束转义序列。Param为属性值,{...}表示可选(多个参数之间用分号隔开,与顺序无关)。
注意,转义序列可被控制字符'CAN'(Cancel )和'SUB'(Substitute)中断。
转义序列相关的常用参数如下(通过man console_codes命令可查看更多的参数描述):
显示:0(默认)、1(粗体/高亮)、22(非粗体)、4(单条下划线)、24(无下划线)、5(闪烁)、25(无闪烁)、7(反显、翻转前景色和背景色)、27(无反显)
颜色:0(黑)、1(红)、2(绿)、 3(黄)、4(蓝)、5(洋红)、6(青)、7(白)
前景色为30+颜色值,如31表示前景色为红色;背景色为40+颜色值,如41表示背景色为红色。
调色效果如下图所示:
因此,通过转义序列设置终端显示属性时,常见格式为:
\033[显示方式;前景色;背景色m输出字符串\033[0m 或 \e[显示方式;前景色;背景色m输出字符串\033[0m
此外,还有一些ANSI控制码,如:nA (光标上移n行 )、nB(光标下移n行 )、nC(光标右移n行 )、nD (光标左移n行 )、2J(清屏)、K(清除从光标到行尾的内容)、s(保存光标位置)、u(恢复光标位置)、?25l(隐藏光标)、?25l(显示光标)。 其中 ,'\033[0m'用于恢复默认的终端输出属性,否则会影响后续的输出。
2、PS2——再谈提示符
一个非常长的命令可以通过在末尾加“\”使其分行显示。多行命令的默认提示符是“>”。 我们可以通过修改PS2 ,将提示符修改为"continue->" 。
ramesh@dev-db ~> myisamchk --silent --force --fast --update-state \
> --key_buffer_size=512M --sort_buffer_size=512M \
> --read_buffer_size=4M --write_buffer_size=4M \
> /var/lib/mysql/bugs/*.MYI
[注: 这里使用 ">" 作为默认提示符]
ramesh@dev-db ~> export PS2="continue-> "
ramesh@dev-db ~> myisamchk --silent --force --fast --update-state \
continue-> --key_buffer_size=512M --sort_buffer_size=512M \
continue-> --read_buffer_size=4M --write_buffer_size=4M \
continue-> /var/lib/mysql/bugs/*.MYI
[注: 与上面类似,用 "continue-> " 作提示符]
当用“\”使长命令分行显示,我发现非常易读。当然我也见过有的人不喜欢分行显示命令
3、PS3——Shell脚本中使用select时的提示符
你可以像下面示范的那样,用环境变量PS3定制shell脚本的select提示:
不使用PS3的脚本输出:
ramesh@dev-db ~> cat ps3.sh
select i in mon tue wed exit
do
case $i in
mon) echo "Monday";;
tue) echo "Tuesday";;
wed) echo "Wednesday";;
exit) exit;;
esac
done
ramesh@dev-db ~> ./ps3.sh
1) mon
2) tue
3) wed
4) exit
#? 1
Monday
#? 4
[注: 缺省的提示符是 #?]
使用PS3的脚本输出:
ramesh@dev-db ~> cat ps3.sh
PS3="Select a day (1-4): "
select i in mon tue wed exit
do
case $i in
mon) echo "Monday";;
tue) echo "Tuesday";;
wed) echo "Wednesday";;
exit) exit;;
esac
done
ramesh@dev-db ~> ./ps3.sh
1) mon
2) tue
3) wed
4) exit
Select a day (1-4): 1
Monday
Select a day (1-4): 4
[注: 设置了PS3变量后,命令提示符已经成为 "Select a day (1-4):"]
4、PS4——PS4-“set -x"用来修改跟踪输出的前缀
如果你像下面那样在调试模式下的脚本中,PS4环境变量可以定制提示信息:
没有设置PS4时的shell脚本输出:
ramesh@dev-db ~> cat ps4.sh
set –x
echo "PS4 demo script"
ls -l /etc/ | wc –l du -sh ~
ramesh@dev-db ~> ./ps4.sh
++ echo 'PS4 demo script'
PS4 demo script
++ ls -l /etc/
++ wc –l
243
++ du -sh /home/ramesh
48K /home/ramesh
[注: 当使用sex -x跟踪输出时的提示符为 ++]
设置PS4后的脚本输出:
PS4在ps.sh中定义了下面两个变量
o $0 显示当前的脚本名
o $LINENO 显示的当前的行号
ramesh@dev-db ~> cat ps4.sh
export PS4='$0.$LINENO+ '
set -x
echo "PS4 demo script"
ls -l /etc/ | wc -l
du -sh ~
ramesh@dev-db ~> ./ps4.sh
../ps4.sh.3+ echo 'PS4 demo script'
PS4 demo script
../ps4.sh.4+ ls -l /etc/
../ps4.sh.4+ wc -l
243
../ps4.sh.5+ du -sh /home/ramesh
48K /home/ramesh
[注: 使用PS4后使 "{script-name}.{line-number}+" 成为set –x的命令提示符]