第十一章 Korn shell
翻译:hfzheng
hfzheng@sohu.com
转载请保留此信息
作为命令翻译器的shell
在任何UNIX环境下,shell通常作为命令翻译器。通过对命令行方式下键入的命令或放在脚本文档中的命令行进行翻译,能够和内核进行交互。Shell接收、分析、处理来自用户或脚本文档的输入,作为命令翻译器对这些输入进行翻译,并对不正确的命令给出错误信息。
Shell是能够转换的,因此用户在任何时候都能够选择使用哪个命令翻译器,在Bourne shell、C shell、Korn shell之间转换是很容易的。
尽管shell最终负责确保命令行提示符下键入的任何命令的正确执行,shell更有其他重要的功能。
作为命令翻译器的shell的职责:
1、shell在任何由shell环境变量PATH定义的目录位置中搜索命令,shell从左到右搜索PATH定义的、以:分割的目录;
2、shell配置管道、输入输出重定向和后台处理;
3、shell能够由用户定制,通过为命令或命令序列创建别名,或当别名不够时创建函数来定制;
4、通过配置shell变量TERM,shell能够适应不同的终端环境;
5、shell保存了键入命令完成机制;
6、shell在历史列表中保存了先前执行过的命令,能够用于重新运行或编辑;
7、通过使用shell初始化文档,系统能够为每个用户定制shell。
输入输出重定义和管道
接下来的部分讨论重定向和输入输出管道
重定向数据I/O
通常情况下,shell从键盘接收或读取输入的命令,显示或写命令输出到终端屏幕。但是,您能够使用重定向字符<和>来告诉shell重定向命令输入和输出。
I/O重定向通常用于命令行的输入和输出到文档中或到shell脚本中。
输入重定向从文档中读取必要的输入而不是接收自键盘,输出重定向把一个命令的输出送到一个文档或送到其他命令(使用管道)而不是送到终端屏幕。
文档描述子
由shell创建的每个进程都关联着一个文档描述子,列出如下:
文档描述子功能
0 stdin标准输入
1 stdout标准输出
2 stderr标准错误
这些描述子由shell所使用,用于确定命令的输入来自何处,命令的输出和出错信息送到什么地方。
标准命令输入和输出
以下部分对标准命令适用:
1、标准输入(stdin):文档描述子总是0
2、标准输出(stdout);文档描述子总是1
3、标准出错(stderr):文档描述子总是2
处理文档内容任何命令都通过读标准输入、写标准输出来实现的。
重定向标准输入、标准输出、标准出错
能够修改标准输入、标准输出、标准出错的默认行为。
重定向标准输入
下面解释如何重定向一个标准输入命令:
command < filename 或 command 0< filename
command从一个名为filename的文档中读取他的输入,而不是从键盘中接收。例如:
$ mailx user1 < ~/dante
重定向标准输出
下面解释如何重定向一个标准输出命令:
command > filename 或 command 1> filename
command把结果输出到一个名为filename的文档中,假如文档filename不存在,将会被创建,假如文档filename存在,重定向覆盖文档filename的内容。例如:
$ ps –ef > process_list
使用添加模式重定向标准输出
下面解释如何使用添加模式重定向一个标准输出命令:
command >> filename
命令的输出被重定向到文档filename中,假如该文档存在,则把命令输出添加到文档内容的末尾。但是文档filename不存在,则创建该文档,例如:
$ cat /etc/passwd > my_file ; cat my_file
$ echo “That’s my passwd file” >> my_file; cat my_file
重定向标准错误
下面的示例显示了如何重定向一个标准错误:
command 2> /dev/null
命令的任何错误信息都被送到/dev/null文档中。这在抑制不重要的错误时很有用,这样能够没有任何错误显示在终端屏幕上,例如:
$ find /etc –type f –exec grep PASSREQ {} \; -print 2> /dev/null
重定向标准输出和标准错误
下面的示例显示了如何重定向标准输出和错误:
command 1> filename 2>&1
语法2>&1告诉shell重定向标准错误(stderr 2)到和标准输出(stdout 1)重定向相同的一个文档中,例如:
$ ls /var /no 1> dat 2>&1
管道特点
shell使您能够更有效地把两个命令连接在一起,这个连接就是管道。在命令行中建立管道就是把一个命令的输出作为作为另外一个命令的输入。管道由字符|表示,放在两个命令之间。
命令格式
command | command
一些使用管道的基本示例
假如两个命令,第一个命令写命令输出到标准输出,第二个命令从标准输入中读取输入,则能够在这两个命令之间创建管道。
例如:
$ who | wc –l
第一个命令的输出被直接连接到第二个命令的输入。Who命令的输出从不输出到终端屏幕上,因为已被管道化为wc命令输入。
要得到当前系统中活动进程的总数目,使用下面命令:
$ ps –ef | wc –l
要得到/etc目录下的任何子目录列表,执行下面命令:
$ ls –F /etc | grep “/”
创建管道
能够创建用来连接多个命令的管道,例如:
$ head –10 dante | tail –3 | lp
Korn shell的配置
用来控制korn shell行为的配置都是开关变量,他们都是boolean变量,因此,每一个都能够ON或OFF:
打开一个配置,键入:
$ set –o option_name
关闭一个配置,键入:
$ set o option_name
在I/O重定向过程中保护文档内容
重定向标准输出到一个已存在的文档中时将导致数据丢失,为了防止发生数据丢失,shell支持noclobber配置:
使用set命令能够激活noclobber配置,例如:
$ set –o noclobber
使noclobber失效
要暂时使noclobber配置失效能够在命令行上使用>|语法,noclobber配置只是对该命令行失效,文档的内容被覆盖:
$ ls –l >| file_new
要永久关闭noclobber配置,执行以下命令:
$ set o noclobber
korn shell的文档名称完成
文档名称完成,通常称为文档名扩展,是允许您键入文档名称的第一个字符,然后通过一个特定的键序列来告诉korn shell来完成文档名称的其他部分的一种机制。
在korn shell中用于文档名称自动完成的键序列有Esc和\键。
使用文档名称完成:
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!



