还有一个使工作变得轻松的方法是使用命令别名命令别名通常是其他命令的缩写用来减少键盘输入
命令格式为:
alias [aliasname=originalcommand]
其中aliasname是用户给命令取的别名originalcommand是原来的命令和参数需要注意的是由于Bash是以空格或者回车来识别原来的命令的所以如果不使用引号就可能导致Bash只截取第一个字从而出现错误如果alias命令后面不使用任何参数则显示当前正在使用的被别名化的命令及其别名为命令取的别名在该次登录期间始终有效如果用户需要别名在每次登录时都有效那么就将alias命令写到初始化脚本文件中
[例]如果经常要键入如下的命令最好为它建立一个别名来减少工作量
$ cd /usr/X/lib/X
假如为这个长命令建立一个名为goconfig的别名在Bash提示符下键入如下命令
$ alias goconfig=cd /usr/X/lib/X
现在除非您退出Bash键入goconfig将和原来的长命令有同样的作用如果想取消别名可以使用下面的命令
$ unalias goconfig
这是一些很多人认为有用的别名可以把它们写入初始化脚本文件中来提高工作效率
alias ll=ls –l
alias log=logout
alias ls=ls –F
如果您是一名DOS用户并且习惯了DOS命令可以用下面的别名定义使Linux表现得象DOS一样
alias dir=ls
alias copy=cp
alias rename=mv
alias md=mkdir
alias rd=rmdir
注意在定义别名时等号两边不能有空格否则shell不能决定您需要做什么仅在命令中包含空格或特殊字符时才需要引号
如果键入不带任何参数的alias命令将显示所有已定义的别名
提示符
Bash有两级提示符第一级提示符是经常见到的Bash在等待命令输入时的情况第一级提示符的默认值是$符号如果用户不喜欢这个符号或者愿意自己定义提示符只需修改PS变量的值例如将其改为
PS=Enter a command:
第二级提示符是当Bash为执行某条命令需要用户输入更多信息时显示的第二级提示符默认为>如果需要自己定义该提示符只需改变PS变量的值例如将其改为
PS=More information:
上面的两个例子都是设定提示符为静态字符串的情况其实用户也可以使用一些事先已经定义好的特殊字符这些特殊字符将使提示符中包含当前时间之类的信息表列出了最常用的一些特殊字符及其含义
表 bash提示符常用特殊字符
特殊字符 说 明
! 显示该命令的历史编号
# 显示shell激活后当前命令的历史编号
$ 显示一个$符号如果当前用户是root则显示#符号
\ 显示一个反斜杠
d 显示当前日期
h 显示运行该shell的计算机主机名
n 打印一个换行符这将导致提示符跨行
s 显示正在运行的Shell的名称
t 显示当前时间
u 显示当前用户的用户名
W 显示当前工作目录基准名
w 显示当前工作目录
这些特殊字符可以组合起来为用户提供一些提示符提供很有用的信息下面来看几个实际例子
PS=t
将使提示符变成如下所示
::
而 PS=t
将使提示符变成如下所示
t
若PS=t\
将使提示符变成如下所示
::
该例就是使用两个特殊字符的组合得到的
控制shell的运行方式
Bash有一些特殊变量能控制shell以不同的方式工作例如变量noclobber能防止在重定向输出时意外地覆盖一个文件通过set命令可以设置noclobber变量的有效或无效set命令有两个参数一个是指定变量开(on)或关(off)的选项一个是特殊变量的变量名要使某一特殊变量开(有效)用o选项要使其关(无效)用+o选项例如
$ set –o noclobber // 使noclobber变量开
$ set +o noclobber // 使noclobber变量关
三个最常用的shell特殊变量有ignoreeofnoclobber及noglob
ignoreeof
ignoreeof变量用来禁止使用ctrl+d来退出shell(ctrl+d不仅用来退出shell而且可以终止用户直接输往标准输出上的输入该操作经常在一些shell实用命令中使用例如实用命令cat在这些实用程序操作中非常容易误操作而意外地退出shellignoreeof特殊变量正是用来防止这种意外的退出例如
$ set –o ignoreeof
之后用户只能用logout或exit命令退出shell
noclobber
noclobber变量可以在重定向输出时保护已存在的文件防止被意外地覆盖在下例中用户设置noclobber为有效在重定向时用户试图去覆盖已经存在的文件myfile此时系统将返回一个错误信息
[例]
$ set –o noclobber $ cat preface>myfile bash: myfile: cannot overwrite existing file $
noglob
设置noglob变量后shell将不扩展文件名中一些特殊的字符或字符串如字符*?[ ]等将不再作为通配符如果用户希望列出结尾为?的文件名answer?可通过如下步骤首先用户使noglob变量为无效然后再列出文件名可以看到目前命令行上的问号?被认为是文件名中的一个字符而不再被看作通配符
$ set –o noglob
$ ls answer?
answer?
子shell与export命令
用户登录到Linux系统后系统将启动一个用户shell在这个shell中可以使用shell命令或声明变量也可以创建并运行shell脚本程序运行shell脚本程序时系统将创建一个子shell此时系统中将有两个shell一个是登录时系统启动的shell另一个是系统为运行脚本程序创建的shell当一个脚本程序运行完毕它的脚本shell将终止可以返回到执行该脚本之前的shell从这种意义上来说用户可以有许多shell每个shell都是由某个shell(称为父shell)派生的
在子shell中定义的变量只在该子shell内有效如果在一个shell脚本程序中定义了一个变量当该脚本程序运行时这个定义的变量只是该脚本程序内的一个局部变量其他的shell不能引用它要使某个变量的值可以在其他shell中被改变可以使用export命令对已定义的变量进行输出export命令将使系统在创建每一个新的shell时定义这个变量的一个拷贝这个过程称之为变量输出
[例]在本例中变量myfile是在dispfile脚本程序中定义的然后用export命令将变量myfile输出至任何子shell例如当执行printfile脚本程序时产生的子shell
dispfile脚本程序清单 /**************begin dispfile**************/ myfile=List export myfile echo Displaying $myfile pr –t –n $myfile printfile /**************end dispfile***************/
printfile脚本程序清单 /**************begin printfile**************/ echo Printing $myfile lpr $myfile& /**************end printfile**************/
$dispfile Displaying List screen modem paper Printing List $
定制Bash
在本节中已经介绍了很多定制Bash的方法但是迄今为止这些方法都只是对当前Bash对话有用只要用户退出登录所做的一切改变都会丢失所以应该在Bash的初始化文件中做永久性的修改
用户可以将每次启动Bash所需要执行的命令放入初始化文件中最常见的命令就是alias命令和变量定义两种系统中的每个用户在其主目录中都有一个bash_profile文件Bash每次启动时都将读取该文件其中包含的所有命令都将被执行
下面便是默认bash_profile文件的代码 #bash_profile #Get the aliases and functions if [f ~/bashrc ];then ~/bashrc fi #User specific environment and startup programs PATH=$PATH:$HOME/bin ENV=$HOME/bashrc USERNAME= Export USERNAME ENV PATH
思 考 题
Linux中的shell有哪些类型?Linux操作系统的缺省shell是什么?
shell有哪些通配符?各起什么作用?
shell中有哪三种引号?它们的作用有什么不同?
要统计/usr/bin目录下的文件个数用重定向和管道分别完成怎样做?
命令替换与重定向有何区别?举例说明
勇于接受自己的不完美,认清自己不足的地方,