shell有很多命令,之前说过,特殊内建命令与一般内建命令的差别在于shell查找要执行的命令时,会先查找特殊内建命令再找shell函数,接下来才是一般内建命令。最后是$PATH路径内的外部命令。这种查找顺序让定义shell函数以扩展或覆盖一般shell内建命令成为可能。举例说你希望shell的提示号能包含当前目录路径的最后一个组成部分。最简单的实现方式,就是在每次改变目录时,都让shell改变PS1.你可以写一个自己专用的函数如下:
# chdir ---改变目录时更新PS1的个人函数
chdir () {
cd "$@" #实际更改目录
x=$(pwd) #取得当前目录的名称
PS1="${x##*/}$ " #截断前面的组成部分后,指定给PS1
}
这么做有个问题,你必须在shell下输入chdir而不是cd,这样你可以自己写一个名为cd的函数,然后shell会先找到你的cd函数,而不是一般内建函数cd。但是这样又会有问题,shell函数如何真正访问cd命令,这里函数内cd会再此调用你写的cd函数导致递归出现。这时候我们需要转义策略,使用内建命令command来告诉shell要避开函数的查找直接访问真正的命令。
#cd --改变目录时更新PS1的私人版
cd(){
command cd "$@"
x=$(pwd)
PS1="${x##*/}$ "
}
第八章产生脚本
详细讲了一下set命令。。。
这一章详解了两个好用脚本的实现过程,这两个脚本详解内容揉杂在注释里给出。
脚本一:功能是在给出的路径下查找目标路径
#! /bin/sh -
#
# 标准输出所产生的结果,通常是查找路径下找到的每一个文件之第一个实体的完成路径,
# 或是“filename: not found ”的标准错误输出。
#
# 如果所有文件都找到,则退出码为0,
# 否则,即为找不到的文件个数(非0)
# shell的退出码限制为125
# 语法:
# pathfind [--all] [--?] [--help] [--version] envvar pattern(s)
#
# 使用--all选项时,在路径下的每一个目录都会被查找,
# 而非停在第一个找到者。
# 所有脚本的头部说明脚本功能是必不可少的,对人阅读很有用。
#在网络的环境下,安全性一直是必须慎重考虑的问题。其中有一种攻击shell脚本 #的方式,是利用输入字段分隔字符:IFS,它会影响shell接下来对输入数据解释的
#方式。为避免此类的攻击,部分shell仅在脚本执行前,将IFS重设为标准值;其他
#则导入该变量的一个外部设置。很难在屏幕上看出来,单引号内包含一个换行一
#个空格和一个制表符,这是IFS的默认值。也可以使用转义 40tn,但bourne
#shell不支持这一的转义。重新定义IFS时有一点要特别留意,当"$*"展开以回复命
#令行时,IFS值的第一个字符,会被当成字段分隔符。这里不使用$*,不受影响










