全部博文(26)
分类: LINUX
2012-08-16 10:11:17
摘自:[美]Harley Hahn:Unix & Linux大学教程
八、使用shell:命令与定制
注:本文命令中出现的符号均为英文符号,请使用时自行替换。
(1)元字符
当使用shell时,还有许多其他字符拥有特殊的含义,这种字符称为元字符。
元字符包括:{ } | < > ( ) # ; ` ~ ? [ ] * ! & \ ‘ “ $
(2)引用和转义
希望按字面上的含义使用元字符时,必须使用引用。字符的引用方法有3种:使用反斜线、使用一对单引号或者使用一对双引号。
当使用反斜线时引用单个字符时,我们称反斜线为“转义字符(escape character)”,它告诉shell从一种模式改变到另一种模式。
使用反斜线引用单个字符(称为转义了这个字符),可转义新行字符。
使用单引号引用一串字符。(强引用)
使用双引号引用一串字符,但是保留了$ (美元符号)、` (反引号)、\ (反斜线)的特殊含义。
(3)shell内置命令:type
shell决定如何处理命令,其可能性有两种。一些命令在shell的内部,这意味着shell可以直接解释它们。这些命令是内部命令,通常称为内置命令(builtin command,或者简称builtin)。其他所有命令是外部命令,即必须单独运行的程序。
查看命令是否为shell内置命令的方法有两种。一是查看该命令的说明书页,内部命令无说明书页。二是使用type命令,语法为: type command
(3)查看内部命令
man bash/ ksh/tcsh/csh
一些Unix/Linux系统对于内置命令拥有独立的说明书页。使用apropos命令可以查看系统是不是属于这种情况: apropos builtin
如果系统上有这样的说明书页,那么它就是快速查看所有内置命令列表的地方。对于Linux和FreeBSD来说,可以使用: man builtin
对于Solaris,可使用: man shell_builtins
Linux还有一个help命令,可以以若干种方式显示builtin说明书页中的信息。该命令语法为: help [-s] [command…]
command是命令的名称,-s (syntax,语法)
(5)外部命令及搜索路径
shell从PATH环境变量查找外部命令,PATH包含一串字符,这串字符就是一系列目录名称,我们称之为搜索路径。
显示PATH变量的值: echo $PATH
(6)修改搜索路径
对于Bourne Shell家族:
export PATH=”/bin:/usr/bin:/usr/ucb:/usr/local/bin”
对于C-Shell家族:
set path=( /bin /usr/bin /usr/ucb /usr/local/bin)
将家目录的bin放在搜索路径最后
export PATH=”$PATH:$HOME/bin”
set path=($path $HOME/bin)
将其插在开头:
export PATH=”$HOME/bin:$PATH”
set path=($HOME/bin $path)
(7)修改shell提示环境
修改一个PS1的变量即可
对于Bourne Shell,可以设置一个$字符加一个空格: export PS1=“$ ”
对于C-Shell: set prompt=“% ”
如果是Tcsh: set prompt=“> ”
(8)引用变量使用哪类引号
当需要使用变量时,心里要想一想:“该变量的值在使用之前是否会变化?”如果答案是肯定的,则使用强引用(也就是单引号)来防止$字符被解释,直至需要它们。否则,使用弱引用(双引号),从而允许$字符被立即解释。
(9)使用转义字符的特殊码
只有Bash和Tcsh允许使用这种的特殊码。
Bash可使用的特殊码:
工作目录: ~表示法 \w
工作目录: 只有基名 \w
计算机主机名: \h
当前用户标识: \u
shell的名称: \s
时间:AM/PM表示法 \@
时间:24小时制 \A
日期: \d
历史列表:事件编号 \!
例:在Bash提示中显示时间和日期
export PS1=“\d \@ $ ”
两种有趣的变量RANDOM和SECONDS
export PS1=‘Your lucky number is ${RANDOM} $ ’
export PS1=‘Working time: ${SECONDS} $ ’
(10)命令替换
命令替换允许在一条命令中嵌入另一条命令。shell首先执行嵌入的命令,并且输出替换该命令。然后,shell再执行整个命令。
通过将一条命令封装在`(反引号)字符中,可以将它嵌入到另一条命令中,如:
echo “The time and date are `date`.”
使用basename可以抽取任何路径名的最后一部分,它的目的是一条完整的路径名,并输出路径名的最后一部分。例:
export PS1=“`basename ${SHELL}`$ ”
export PS1=“`whoami`$ ”
(11)历史列表:fc、history
对于Bourne Shell家族,可以使用fc命令加上-l(list,列举)显示历史列表,fc -l
对于C-shell家族,可以使用history命令:history
通过事件编号也可以调取并执行特定的命令。对于Bourne Shell,可以使用-s(substitute,替换)选项的fc命令,后面跟事件编号,fc -s 24
对于C-shell来说,该命令只需键入一个!字符后接事件编号,!24 (无空格)
重新执行上一条命令:
fc -s (Bourne Shell)
!! (C-shell)
在重新执行命令前对命令进行小的修改:
fc -s pattern=replacement number
!number:s/pattern/replacement/
在两种情况中,pattern和replacement指的是字符串,而number指的是事件编号。
例如,事件编号25是用vi编辑tempfile文件的命令,再次运行时,想编辑data文件,则:
fc -s tempfile=data 25
!25:s/tempfile/data
如果希望使用最近用过的命令,那么命令就比较简单。假如希望输入date,却不小心输成datq,而且将其运行。因此,您希望将q改成e,然后再重新执行这个命令。
对于fc -s来说,如果不指定事件编号,默认为上一条命令:
fs -s q=e
对于C-shell,可以使用下述语法:
^pattern^replacement
如在本例中:^q^e
提示:Bash有两个优点,一是既可以用fc命令,也可以使用history/!系统。其次,Bash支持一个额外的我,即使用^R(可以认为它是重新调用键)。按^R键并键入一种模式,然后Bash将重新调用包含该模式的最后一条命令。例如,调用最近一条ls命令,可以按^R键,然后再键入ls。如果得到的命令并不是希望的命令,可以再次按下^R键,获得包含该模式的下一条最近的命令。
名称fc代表“fix command, 修复命令”。这是因为当命令键入错误时,可以使用fc修改命令,然后再重新执行命令。
(12)历史列表:设置大小
Bourne Shell:历史文件将被自动保存和恢复
C-shell:除非设置了shell变量savelist,否则将不会自动保存。
设置历史记录大小:
export HISTSIZE=50
set history=50
C-shell自动保存历史列表 set savelist=30
(13)在shell提示中显示事件编号和工作目录
显示事件编号:
export PS1=“bash[\!]$ ”
export PS1=“ksh[!]$ ”
set prompt=“csh[\!]% ”
set prompt=“tcsh[%\!]> ”
显示工作目录和事件编号
export PS1=“(\w) bash[\!]$ ”
export PS1=“($PWD) ksh[!]$ ”
set prompt=“(\$PWD) csh[\!]% ”
set prompt=“(%~) tcsh[%\!]> ”
(14)别名:alias、unalias
别名就是赋予一条命令或者一列命令的名称。
对于Bourne Shell,语法为:
alias [name=commands] 等号两边无空格
对于C-shell,语法为:
alias [name commands]
例: alias info=’date;who’ alias info ‘date;who’
alias a=alias alias a alias
如果希望修改别名的含义,则只需重定义这个别名。
显示所有的别名,可以输入没有参数的alias命令:alias
使用unalias命令可以移除别名,该命令的语法为: unalias name
有时,为了临时挂起别名(只针对一条命令),只需在命令名称开关键入一条\(反斜线)字符,如:
\ls
别名示例:1) 避免删错文件
如要执行rm temp* extra?,先执行ls temp* extra?查看文件,避免删错,可使用fc -s ls=rm
为了更简单,可以定义一个del的别名:
alias del=’fc -s ls=rm’
对于C-shell家族,使用^ls^rm。由于技术原因,这条命令不能使用别名。相反,需使用命令rm !ls:* 为了使这条命令更容易使用,可定义一个别名
alias del ‘rm \!ls:*’
别名示例:2)从历史列表中重用命令
定义一个history的别名:
alias history=”fc -l”
alias h=history
接下来定义别名r(recall,调取)来取代fc -s,即从历史列表中调取命令并重新执行
alias r=”fc -s”
别名示例: 3) 在shell中显示工作目录(C-shell)
alias cd ‘cd \!* && set prompt=“($PWD)% ”’