第7章、UNIX的shell命令
本章将介绍:各种shell解释器共同点、标准shell介绍、C shell介绍、Korn shell介绍。
在Solaris 2.x软件环境中提供给用户三种命令解释器:标准shell(缺省shell或Bourne shell,本手册中我们称为标准shell)、C shell和Korn shell。对每一个用户而言都有一个缺省的shell命令解释器,另外也可以在命令行中打入某种shell而重新进入另外一种shell解释器。本章首先介绍三种shell的公共命令,然后再分别对它们各自的特性作一些详细介绍。
7.1各种shell的公共命令
本节描述各种shell所使用的命令
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
表7.1 各种shell解释器的基本特性
特性 Bourne C Korn
别名 无 有 有
命令编辑 无 有 有
增强的cd 无 有 有
历史 无 有 有
忽略CTRL-D 无 有 有
不同于profile的初始文件 无 有 有
作业控制 有 有 无
退出文件 无 有 有
文件的重写保护 无 有 有
与标准shell的语义兼容性 是 否 是
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
7.1.1设置某种缺省shell
在用户数据库或/etc/passwd文件中,注册shell是在每个用户的登记项的最后一列中设置,用户可以使用系统提供的管理工具或编辑本地的/etc/passwd文件来修改注册shell,但是此用户必须是sysadm组的成员,即用户的组号(GID)应该是14,如果是在运行NIS+,则必须有建立和删除NIS+数据据库的权限。
下面是用户更改注册shell的一些步骤:
1、按需要,从管理工具中打开数据库管理器窗口。
2、 在用户数据上,按下SELECT,然后再接着按SELECT来选择NIS+或无NIS+服务。若选择NIS+则编辑Passwd数据库,否则编辑本地的/etc/passwd文件。
3、 点击Load键,显示用户数据库窗口。
4、 在想要编辑的用户项上按SELECT鼠标键,然后从编辑(Edit)菜单中选择修改(Modify)项。
5、 修改shell项的文字域,/bin/sh是标准shell,/bin/csh是C shell或者输入/bin/ksh作为Korn shell。
6、 点击Modify按钮,修改用户缺省SHELL定义,只要用户重新注册进入系统,即使用新的shell。
7.1.2在命令行中改变shell类型(sh,csh,ksh)
如果用户不修改用户数据库而想使用别的shell解释器,则可以在命令行中简单地打入所需shell的命令名即可。
例如,要想使用C shell,打入csh即可,缺省C shell提示符是在系统名之后跟一个百分号(%)。
$csh
gtxa%
如果要改变为Korn shell,则打入ksh,korn shell的缺省提示符是$
gtxa%ksh
$
7.1.3从shell解释器中退出(exit)
如果用户是在命令行中进入某种shell解释器,则只需打入exit和回车键,即可退出当前的shell解释器,而返回原先的shell解释器。
$exit
gtxa%
7.1.4清除一个shell窗口(clear)
在某个shell窗口中,用户可以清除一个shell窗口的内容,并且重新显示shell的提示符到此窗口的左上角,例如要清除一个窗口的内容,可以打入clear和回车键:
gtxa%which openwin
no openwin in. /home/ignatz/usr/deskset/bin/usr/bin
/home/ignatz/bin/bin/home/bin/etc/usr/etc/usr/etc/usr/ucb
/usr/bin
gtxa%clear
此时窗口的显示内容即被清除,然后把提示重新显示在顶部。
7.2标准shell
在Solaris 2.x软件环境中,标准shell(Bourne shell)是缺省shell,它是由Steve Bourne先生在AT&T Bell实验室工作时开发的,标准shell相对而言,结构紧凑,而且简单,但它也提供所有的程序设计功能,可以实现由各种命令和过程组成的shell文件(script)。因为如何编写shell文件已经超越本文范围,所以我们不在此赘述。
7.2.1标准shell的初始文件
标准shell只使用一个初始执行文件,其名为.profile,一般放在用户的基目录(home directory)之下,它专门用来设置用户的环境。当用户注册或在命令行中启动标准shell时,即读.profile文件,一般来说,用户通过此文件来设置用户查找路径和其它环境变量。
7.2.2定义标准shell的环境变量
对于标准shell和Korn shell而言,定义环境变量的语法都是一样的,输入命令=; export,例如:
$HZ=100;export HZ
$
7.3 C shell
C shell是Bill Joy先生在UCB工作学习时开发的,它已被UNIX的众多用户所接受。C shell完全不同于标准shell和Korn shell,而且有自己独特的语法规则,C shell最重要的优点是具有历史功能、命令编辑功能和别名功能。历史功能的意义是C shell可以存贮用户最近输入的命令记录,用户可以显示这些命令,也可以按原样重新使用某条命令;而编辑功能是用户可以通过编辑来改变某条命令;别名可以让用户用短的名字来表示经常使用的长命令,或几条常用命令。
7.3.1C shell的初始文件
C shell使用两个初始化文件,用于设置用户的环境变量,这两个初始文件名分别是.login和.cshrc,也放在用户基本目录之下。
当用户注册时,C shell首先读.login,然后再读.cshrc文件。当用户是从命令行中启动C shell时,只读.cshrc文件(C shell运行控制)。因为.login文件不是每次启动C shell都读入,因此用户应该在.login中设置环境变量,而在.cshrc文件中设置用户的查找路径名。
7.3.2C shell环境变量的定义
使用命令setenv ,例如:
gtxa%setenv display rogue:0
gtxa%
7.3.3建立C shell的别名
用户可以在.cshrc文件中定义所需的别名。建立一个别名的语法为:
alias
例如,你想简写别名(alias)这个命令成为a,则可以在.cshrc文件加入下列一行:
alias a alias
下面的实例选自.cshrc文件。注意,如果命令行中包含有空格,则必须把整个命令中用引号引起来,引号可以是双引号,也可以是单引号:
alias a alias
a h hiostory
a c clear
a lf 1s -F
a ll "ls -l | home"
a la ls -a
a s "source .cshrc"
a f ‘find -name core -print'
a copytotape "ter cvf /dev/rmt/0 *"
7.3.4设置C shell的历史功能
要设置C shell的历史功能,只需在命令行中打入:
set history=
其中,n可理解为C shell可以存贮的命令条数。举例:
gtxa%set history=18
gtxa%
用户既可在shell窗口中"临时"设置历史功能,也可以把它放在.cshrc文件中设置"永久"的历史功能。
7.3.5使用C shell历史功能
在命令行中,打入history命令,即可显示已经打入过的命令,这些命令是你打入的最后n条命令,n是像7.3.4节所述的方法设置的。
gtxa%history
26 pwd
27 kermit
28 cd howto
29 tar avf /dev/rmt/0
30 ls -l howto*
31 cd
32 cd Config/Art
33 ls -1
34 tar cvf /dev/rmt/0
35 histoty
gtxa%
要想重复执行刚打入的命令,可打入!!和回车,即复执行上一条命令:
gtxa% history
26 pwd
27 kermit
28 cd howto
29 tar avf /dev/rmt/0
30 ls-l howto*
31 cd
32 cd Conrig/Art
33 ls-1
34 tar cvf /dev rmt/0
35 histoty
gtxa%!!
history
27 kermit
28 cd howto
29 tar avf /dev/rmt/0
30 ls-l howto*
31 cd
32 cd Conrig/Art
33 ls-1
34 tar cvf /dev rmt/0
35 history
36 history
gtxa%
要重复最后一条命令的最后一个词,可打入!$,这样上一条命令的最后一个词即可作为当前命令行中的一个变量。例如,你可能已经输入了某个文件的全程路径,然后想用这个路径名作为变量,来用vi编辑此文件或打印此文件:
gtxa%ls -l /home/ignatz/quest
gtxa%lp !$
gtxa%
!$可以用在命令行的任何地方,在下面的命令行中,文件/home/ignatz/quest将拷贝到/tmp目录之下:
gtxa%ls -1 /home/ignatz/quest
gtxa%cp !$ /tmp
cp /home/ignatz/quest /tmp
gtxa%
要想重复C shell历史令表中的某个序号的命令,则打入!,例如:
gtxa%history
29 tar avf /dev/rmt/0
30 ls -l howto*
31 cd
32 cd Config/Art
33 ls -1
34 tar avf /dev/rmt/0
35 ls -l
36 cd
37 lp howto*
38 history
gtxa%!32
cd Config/Art
gtxa%
7.3.6设置C shell的退格键(stty erase)
如果用户想把删除字符的键从Delete键变为Backspace键,则可以输入下面的命令:
gtxa%stty erase ^H
gtxa%
此后,退格键(Backspace)即作为字符删除键使用。
7.3.7新命令的嵌入
C shell为所有命令路径变量建立一个内部命令表,因此当用户把新命令放入某个目录中时,这个新命令并不在这个表中,这样,C shell就不会执行此新命令。C shell为了解决这个问题,把用户的新命令加入到查找路径内部表中,为用户提供了rehash命令,用户只需打入rehash命令,即可使这条新命令有效:
gtxa%newcommand
newcommand: Command not found
gtxa%rehash
gtxa%newcommand
gtxa%
7.3.8Cshell历史命令的编辑
用户可以从C shell的历史表中编辑命令,其语法:
S//
下面我们举例说明:
gtxa% history
31 cd
32 ls
33 cd/home/frame3.1
34 ls
35 cd
36 tar cvf /dve/rmt/0 frame3.1
37 lp questionnaire
38 lpstat -t
39 echo $PaTH
40 history
gtxa%!39:s/a/A/
echo $ PATH
.:/home/winsor:/usr/openwin/bin:/usr/deskset/bin:/home/
winsor/bin:/bin:/home/bin:/etc:/usr/etc:/usr/bin:/home/
frame3.1/bin
gtxa%
在此例中,第39条命令行中用户打错了一个字母,然后用户用C shell编辑命令改正了打错的那个字母,命令执行也就正常了。
7.4 Korn shell
Korn shell是AT&T Bell实验室的David Korn开发的,是标准shell超集,Korn shell使用标准shell一样的语法,只不过Korn shell本身又加入了许多新的功能, Korn shell 比C shell提供了更加方便的命令编辑方式,Korn shell一样亦具有历史和别名功能。
7.4.1Korn shell的初始化文件
korn shell使用两个初始文件,它们都存放在用户的基目录之下,其名分别为.profile和.,第二个文件名是可以让用户自己选择命名的,其主要功能是设置环境,同C shell类似,你可以把第二个文件名选择为.kshrc,以后我们即用.kshrc这个名称来说明第二个文件。
当用户注册时,Korn shell首先读.profile文件,然后读.kshrc。.kshrc主要让用户建立使用Korn shell的习惯约定,在.kshrc应该包括只有Korn shell才能执行的命令。
用户必须用ENV环境变量来指定这.文件的名称,Korn shell设置环境变量的命令语法同标准shell:
=;export
其中export命令是必须的,它使此变量对Korm shell以及它的所有子进程都有效,下面为.kshrc文件设置环境变量:
$ENV=$HOME/.kshrc;export ENV
$
很显然,用户必须将ENV这个环境变量在.profile中设置好,否则当用户注册时,Korn shell就会找不到.kshrc文件。注意,ENV环境变量是没有缺省设置的,用户不设置ENV,就不能使用这此性质。
不论是在注册时,还是在命令行中启动Korn shell,.kshrc文件在每次启动Korn shell时都必须读入。
7.4.2Korn shell的选择项
Korn shell有许多变量可用来指定用户的环境和控制命令的执行,要想显示当前的选择项设置情况,可输入:
$set -o
下例显示了Solaris 2.x软件系统中Korn shell的缺省设置情况:
$set -o
Current option settings
allexport off
bgnice on
emacs off
errexit off
gmacs off
ignoreeof off
interactive on
keyword off
markdirs off
monitor off
noexec off
noclobber off
noglop off
nounset off
privileged off
restricted off
trackall off
verbose off
vi off
viraw off
xtrace off
$
我们在表7.2中说明这些缺省选择项的具体意义。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
表7.2 Korn shell的选项
选择 缺省值 说明
allexport off 当定义时,自动地报告变量
bgnice on 要低优先级执行所有的后台作业
emacs off 设置emacs/gmacs为联机编辑器
errexit off 如果命令返回伪值,则shell执行ERR陷井并立即 退出
gnaces off 设置gmacs/gmacd为联机编辑器
ignoreeof off 当运行在交互式shell 时,则在文件的未尾也不退出shell,只有打入exit才退出shell
interactive on shell自动进入交互式方式,因此也立即显示shell提示符
keyword off shell根据变量赋值语法将每个字放入变量赋值表中
markdirs off 在所有目录名后显示一个"/"
monitor on 使能作业控制
noclobber off 当使用转向输出>时,不覆盖一个已经存在的文件
noexec off 只读此命令,而不执行它,利用此命令可以调试shell文件的语法错误
noglob off 取消文件名的扩充
nolog off 在历史文件中不存贮功能定义
nounser off 当shell想要扩展一下已经设置的变量时,显示一条错误信息
privilrged off 当此选择项是off时,使用实际UID和GID,若是on,则把UID和GID设置成启动此shell时有效值
restricted off 设置一种受限制的shell
trackall off 当命令第一次出现时,使得它成为别名
verbose off 当读入时,即是显示输入
vi off 设置vi为联机的编辑器
viraw 0ff 指定从vi中,每次只输入一个字符
xtrace off 当执行命令的变时时,显示它们
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
按照korn shell的习惯用法,这些选择都在.kskrc文件中设置。
要想使某选择项有效,可输入:
set -o
若要取消这个选择项,可输入:
set +o
例如在.kshrc中输入:
set -o vi
即设置联机编辑器为vi,而是如果是下面这一行:
set +o vi
则是关闭vi作为联机编辑器使用。
用户亦可以用同样的语法,在命令行中设置Korn shell的其它选择项。
7.4.3创建Korn shell的别名
Korn shell创建别名的语法是:
Alias =
例如把别名命令alias别名为a,其命令为:
$alias a=alias
$
Korn shell本身带有一些预先定义好的别名,要显示这张别名表,只需打入alias命令即可:
$alias
autoload=typeset -fu
false=let 0
functins=typeset -f
hash=alias -t -
history=fc -1
integer=typeset -i
nohup=nohup
r=fc -e -
stop-kill-STOP
suspend=kill -STOP $ $
true=:
type=whence -v
$
表7.3描述这些缺省别名的意义。
表7.3 Korn shell缺省别名
别名 值 定义
autoload typeset -fu 定义一个自动装入函数
false let -0 返回非零状态,经常用于产生无限循环
functions typeset -f 显示函数表
hash alias –t - 显示跟踪别名表
history fc -1 从历史文件中列出命令
integer typeset -i 整型变量的说明
nohup nohup 即使退出系统(log out),也继续执行正在运行的作业
r fc -e- 重复执行前面的命令
stop kill -STOP 停止作业
suspend kill -STOP$$ 挂起作业
true ; 返回一个零退出状态
type whence-v 显示命令的信息
7.4.4用Korn shell的联机编辑器编辑命令
使用Korn shell的联机编辑器,用户在执行命令以前可以编辑当前命令。Korn shell的联机编辑器可以是emacs、gmacs或vi,利用Korn Shell的选择项功能,使用下面命令:
set -o
或使用EDITOR或VISUAL环境变量来设置联机编辑器。
Korn shell的在线(或联机)编辑器vi是普通vi程序改进后的子集,使用联机vi编辑器时会自动进入插入方式。
用户在一般情况之下,不需要使用联机vi编辑器,而可直接打入命令并执行之。如果想要编辑某个命令,则打入Escape键进入命令方式,用户可以使用标准的光标移动命令向前移动,也可以使用vi编辑命令编辑这一行的内容。当用户在编辑命令时,按回车即执行此命令,而打入Escape则是回到输入方式。如果用户想要编辑的命令行是在一个vi文件中,则打入v命令即可打开一个含有命令行的