完成这一章,你能够作以下事情:
※了解shell的工作原理
※描述用户登录的过程
※描述用户环境变量和这些环境变量的功能。
※设置和修改shell变量。
※了解和修改一些特殊的环境变量例如PATH ,TERM等等。
※为特定的应用定制用户环境变量。
6.1 什么是shell?
shell是一个交互性命令解释器。Shell独立于操作系统,这种设计让用户可以灵活选择适合自己需要的shell。shell让你在命令行键入命令,经过shell解释后传送给操作系统(内核)执行。
这一章介绍POSIX shell提供的交互的特征。
以下是shell功能的一个汇总:
※查找命令的位置并且执行相关联的程序
※为shell变量赋新值
※执行命令替代
※处理 I/O重定向和管道功能
※提供一个解释性的编程语言界面,包括tests,branches 和loops等语句
※当你登录到一个unix系统,shell会为你的终端登录线索定义一些特征,然后出现你的提示符。在POSIX,Bourn,K
shell中$符号为默认的提示符。C shell中默认的提示符是%号。
6.2 一些通常使用的shell
/usr/bin/sh ????POSIX shell
/usr/bin/ksh ????Korn shell
/usr/old/bin/sh ??Bourne shell
/usr/bin/csh ????C shell
/usr/bin/keysh ???A contest-sensitive softkey shell
/usr/bin/rksh ???Restricted Korn shell
/usr/bin/rsh ????Restricted Bourne shell
POSIX shell
、是一个POSIX兼容的命令编程语言和命令解释器。它可以从终端或者是一个文件中读取并且执行命令。POSIX在许多方面同korn
shell 相似。有历史机制。支持任务控制,和其他有用的特性。
Korn shell 同POSIX shell十分类似,是由贝尔试验室的David Korn开发的。
Bourne shell :缺乏许多在POSIX,和korn shell 中的功能。它是由Stephen R.
Bourne开发的,是AT&T unix中最先使用的shell
C shell。是一个普通的语言解释器,有命令历史机制,类似C语言的语法。和任务控制工具。它是由university of
California at Berkeley 的william Joy开发的。
Rsh 和rksh是Bourne shell 和Korn shell
的受限制的版本。受限制的shell在设置登录名和环境的时候比普遍的shell
有更多的限制。受限制的shell使用起来就象是具有异常现象的标准的shell。
使用受限制的shell的用户不能:
※更改目录
※重新设定PATH变量的值
※在路径名中使用/符号。
※重定向输出。
????????shell特征的一个比较
特性 描述 POSIX BourneKorn C
命令历史 ?在缓冲区内存储命令,以便可以修改和重用
?支持 ??不支持 ??支持 ??支持 ?
行编辑可以使用一个文本编辑器来修改当前的或是先前输入的命令
?支持 ??不支持 ??支持 ??不支持 ?
文件名自动完成 在命令行自动完成键入的文件名?支持 ?不支持 ??支持 ??支持 ?
命令别名 用户可以重命名命令,自动包含?命令选项,或缩短长命令行输入 ?支持 ??不支持 ??支持 ??支持 ?
受限制的Shell 提供一个可控制的和一些有限的功能的安全性的特性?支持 ??支持 ??支持 ??不支持 ?
任务控制?一个跟踪和存取后台运行的进程的工具?支持 ??不支持 ??支持 ??支持 ?
6.3 POSIX shell的特性
POSIX shell 是unix提供的shell中的一个。这种shell有许多Korn shell拥有,但Bourne
shell没有的特征。即使你不会使用到所有的高级特征,你仍然会发现POSIX shell 是一个非常方便的用户界面。以下是POSIX
shell的一些特性:
※命令的历史机制。
※命令行重调用和编辑
※任务控制。
※文件名自动完成。
※命令的别名。
※增强的cd。
※先进的编程能力。
6.4 别名
别名就是命令的一个新的名称。使用别名可以缩短长命令行输入,创建新的命令,或用一种称为别名的新的命令来替代原始的命令执行。别名的组成可以是一个字母或一个短的单词。例如,许多的人非常频繁地使用ps
–ef 命令。如果你使用psf代替这个命令是否会更容易一些?你使用alias命令可以创建别名:
$ alias name= string
在这里,name是你要取的别名,而string是name要取代的命令或者字符串。如果string包括有空格,你要需用引号将整个字符串括起来。别名对于减少键盘输入,减少打字错误,或是创建新的命令会很方便。
别名在使用的时候和其他的命令一样。 执行一个真的的unix系统命令和执行引用到一个unix命令的别名对于用户来说是透明的,没有任何区别。
别名经常用于全路径名的一个缩写。
如果不带差数,alias命令会报告当前定义的所有的别名。
想要列出一个特定的别名,使用alias name命令。
禁止一个别名,可以使用unalias命令,语法是:
unalias name
例子:
$ alias go=’cd’
$ alias there = /home/user3/tree/ford/sports
$ go there
$pwd
/home/user3/tree/ford/sports
6.5 文件名自动完成
例子:
?$ more fra esc esc
?$ more frankenstein
?.
?.?
?.
?$ more abc esc esc
?$ more abcdef esc =
?1)abcdefx1mnop
?2)abcdefy1mnop
?$ more abcdef
然后打x或y,然后连续按两下esc键
系统就会自动完成相关联的文件名。
当你想要存取一个长文件名的时候,你可以使用文件名自动完成功能,如果你输入的字符足够多,能唯一标识一个文件名后,你可以连续敲两下esc键,POSIX
shell就会自动补全文件名的剩余部分。如果输入的字符串并不唯一,POSIX shell 就不能解析到文件名,你的终端会发出蜂鸣。
直到没有文件名冲突时候,连续敲两下esc键,shell会自动完成文件名。你也可以通过敲一下esc键来列出所有可能的文件名。在POSIX
shell列出了有效的选项的时候,你就能够使用编辑命令来增加后来的字符来唯一地确定你所需要的文件名,然后你可以连续敲两下esc键来完成文件名。
文件名自动完成可以在所有的使用文件名路径的时候使用,例如:
$cd tr esc esc do esc esc r esc esc
会显示以下的命令行:
$cd tree/dog.breeds/retriever
6.5 命令的历史机制
语法:
history [-n| a z] 显示以前输入的命令。
例子:
$ history –2 列出最近输入的两个命令
15.cd
16.more .profile
$ history 3 5 列出命令号从3到5的所有的命令
3.date
4.pwd
5.ls
POSIX shell保留一个历史文件来存储你所键入的命令,你可以重输入这些命令。这个历史文件会在你登录时建立,在退出登录时被删除。
history命令会显示你最近输入的16个命令,每一个命令前面都会有一个命令号。你可以通过这个命令号来引用你以前键入的命令。
你可以键入history –n 来显示少于或者多于16个命令。其中n代表命令号。
你可以键入history a z 来显示一个命令号的范围。其中a z代表命令号的一个范围。
HISTSIZE变量定义了保存的的历史命令的数目。(默认值是128)HISTFILE变量定义了保存历史命令的文件的一个文本文件名(默认值是.sh_history).
6.6 重新输入命令
你可以通过简单地键入
r c
来从命令历史中运行任意的命令。
其中c 代表命令号。你也可以键入命令的第一个字母来执行你最近键入的命令,例如:
$ history
1 date
2 cat file1
3 ls –l
$ r d
Mon Jul 4 10:03:13 1994
6.7 用户环境
语法:
env
例子:
$ env
HOME=/home/gerry
PWD=/home/gerry/develop/hasics
EDITOR=vi
TERM=70092
......
PATH=/usr/bin:/usr/contrib/bin:/usr/local/bin:/home/gerry/bin
用户环境记录了关于用户程序的线程的许多信息。 你的环境中的信息有:
※你home路径的路径名
※电子邮件的存放地址。
※你所在地的时区
※你登录的用户名
※shell查找命令的路径
※终端类型
※你的应用可能需要的其他东西。
例如:命令vi和more 需要知道你的终端类型才能以正确的格式输出数据。
与用户环境类似的是你的办公环境。在办公室里的灯光,声音,和温度对所有的工作者都是相同的。而其他的对你来说唯一的因素组成了你的特殊的环境。这些因素包括你正在执行的工作,你的写字台的布局,和你和办公室其他人的关系。你的工作环境就像你的用户环境一样都是唯一的。
许多应用需要你按照一些方式来定制你的环境。这种定制是通过修改你的.profile文件来完成的。
你可以运行env命令来检查你的环境。这个命令会显示你的环境中的每一个变量和变量的值。
每一个环境变量的设置都有一个的意义,以下是一些普通的环境变量和它们的含义:
TERM,COLUMNS,LINES ???你使用的终端的类型。
HOME ??????????你的home目录的路径
PATH ??????????查找命令的位置的一个目录的列表。
LOGNAME ????????登录时使用的用户名
ENV,HISTFILE ??????特殊的POSIX shell 变量
DISPLAY ????????特殊的x windows 变量
在这些变量中,一些是系统设置的变量,其他都是在/etc/profile 或.profile中设置。
6.8设置SHELL变量
※shell变量是一个名称,代表一个值
※与这个名称管关联的值可以被修改
※一些shell变量是在登录的过程中定义的。
※用户可以自己定义新的shell变量
语法:
?name=vales
例子:
?$ PATH=/usr/bin/X11:/usr/bin
shell
变量同代数中的变量很相似。它是代表一个数值。给一个变量赋值就是将一个数值分配到一个变量名上。然后就可以通过这个变量名来存取这个数值。如果这个值被修改,仍然能够通过变量名来存取新的值。给shell变量赋值的语法是:
name=value
你可以在终端的shell提示符下输入,或者在shell脚本中加入这条语句。注意,在等号(=)的前后都没有空格。区别shell变量的名称和shell变量的值十分重要。当一个赋值语句执行的时候,变量的值才会被设定
例如
TERM=70092
这会告诉shell记住TERM这个名称,并且在TERM变量的值被要求的时候,返回70092。
变量名限制
变量名必须由字母开始可以包含字母,数字。下划线,变量名所包含的字符的数量没有限制。
6.9 两个重要的变量
PATH变量
??-shell搜寻你键入的命令所在位置的一个目录的列表
TERMb变量
??-描述你的终端类型和屏幕尺寸(为你运行的程序需要)
?$ env
?...
?PATH=/usr/bin:/usr/contrib/bin:/usr/local/bin
?$TERM=70092
?$
?$ tset
?Erase is Backspace
?kill is Ctrl+U
?$
PATH变量
是shell在寻找命令所要查找的路径的一个列表。它使我们可以简单地键入一个命令名而不需要在前面加上一个完整的一个路径列表。(例如,vi代表/usr/bin/vi)。以下是一个默认的PATH变量的例子:
PATH=/usr/bin:/usr/contrib/bin:/usr/local/bin
这意味着当你键入一个命令的时候,shell会在路径/usr/bin中查找,然后是/usr/contrib/bin,等等,直到找到这个命令,或者找完这些目录都没有发现这个命令。如果没有找到这个命令,会有一个
command: not found的错误信息出现在屏幕上。
TERM是一个描述你的终端类型的环境变量。为了许多的命令能正确运行,它们需要知道你使用的终端类型。例如,ls
命令需要屏幕有多少列,更多的需要知道屏幕有多少行,vi为了正确地工作,同时需要知道你的终端的行与列的数目和关于你的终端更多的信息。终端的类型被设置成为终端的型号的数字。(例如2392,70092,等等)
设置终端变量的默认方法是使用以下的方法:
TERM=(hp)
你的系统管理员也许已经设置好你的系统,所以系统不会询问你的终端类型。在这种情况下你可以使用env命令来检查TERM环境变量的值。如果你使用的工作站只有一个显示器,TERM变量的值就很可能是正确的,不需要更改。
如果你的终端在你使用more 或者vi
的时候出现异常,请检查TERM变量,如果设置正确,执行tset命令。这个命令会使用TERM变量中的值来重新设定你的终端类型。
6.10 常用的变量赋值
黑体字为你要定义的变量。
EDITOR=/usr/bin/vi ?????使用vi作为行编辑器
ENV=$HOME/.shrc ???????在shell启动的时候执行$HOME/.shrc文件
FCEDIT=/usr/bin/vi ?????在先前的命令行开始vi编辑线索。
HOME=/home/user3 ??????指明你的登录的目录
~(波浪符号) ??????????在POSIX shell中等同于你的HOME目录
HISTFILE=$HOME/.sh_history ?存储所有的键入的命令的文件
LOGNAME=user3 ????????指明你的登录标识或是用户名。
MAIL=/var/mail/user3 ????指明你的系统邮箱
OLDPWD=/TMP ?????????指明你所进入的前一个目录
PATH=/usr/bin:$HOME/bin ??指明查找命令的路径。
PS1= ???????????? 指明你的主提示符。
PS1=’[!] $’ ????? ??在提示符中显示命令的行号
PS1=’$PWD $’??????? 在提示符中显示当前的工作路径(注意:必须
使用单引号。
PS1=’[!] $PWD $’ ?????在提示符中显示行号和当前工作目录
PWD=/home/user3/tree ??? 指明你的当前所在的目录。
SHELL=/usr/bin/sh ?????指明你的命令解释程序
TERM=2392a ?????????指明你使用的终端的类型,启动的时候使用命令eval ‘tset –s –Q –h
‘系统会自动读取/etc/ttytype文件,并使用恰当地终端类型来映射你的终端的端口。这在你的系统联接有不同型号的终端的时候十分有用。
TMOUT = 300???????? 如果在指定的时间内没有命令或回车键入,shell会中止或者超时
TZ=EST5EDT?????????定义系统时区以显示正确的时间
6.11 在登录的时候发生了什么?
当你坐下来开始在系统中工作,你会在屏幕上看见login:
提示符。当你键入你的用户名,系统会读取你的用户名,并且提示你输入密码。当你键入你的密码,系统会检查你的用户名和密码(使用/etc/passwd文件)。如果你键入的用户名和密码是正确的,系统会让你进入到你的home目录,并且系统会为你启动shell。我们已经看到了每一次我们登录的时候发生的事情。我们的问题是-当shell启动的时候,系统究竟做了什么?
1.getty
a.显示/etc/issue中的内容
b.出现登录提示符
c.运行登录过程
2.Login
?a.确认用户名和密码的正确性。
?b.将用户放在home目录下
?c.运行用户的shell
3. shell
?a. 执行/etc/profile文件(POSIX,Bourne,和Korn shell) 或者是 /etc/csh.login(C
shell)
?b. 执行用户home目录下的.profile 或者.login文件
c.执行用户home目录下的.kshrc文件(POSIX和Korn
shell)。如果用户创建了这个文件或是在ENV变量中设置.kshrc在.profile文件中。
?d.出现shell提示符
一旦shell开始运行,他会从系统命令文件/etc/profile中读取命令执行.用户无论在什么时候登录和启动一个shell,这个文件都会被读取,然后shell会读取你自己的.profile文件。这两个shell脚本被用来定制一个用户的环境。
/etc/profile中设置了系统中每个用户的基本的环境。而.profile文件更多的是定制你特殊的需要。因为每一个人都会使用/etc/profile文件,所以系统管理员有责任维护这个文件。
当这两个程序都完成后就会出现shell提示符。
6.12 shell启动文件
Korn(/usr/bin/ksh)?????????.profile
?????????????????? ?.kshrc
Bourne(/usr/old/bin/sh)?????? .profile
POSIX(/usr/bin/sh) ???????? .profile
???????????????????.kshrc
Restricted(/usr/bin/rsh,?????.profile
/usr/bin/rksh)
C(/usr/bin/csh)?????????? .profile
???????????????????.cshrc
系统在配置你的线程的时候通常需要一些环境变量(例如:PATH,EIDTOR.)。正如你已经看到的,它们必须在你每次登录的时候定义。.profile文件和.kshrc文件十分有效。它们是简单的shell脚本文件,可以用来定制你的环境变量,定义别名,在登录时执行程序。由于POSIX
shell 是起源于Korn shell,而Korn shell又是起源于Bourne shell,所以,POSIX shell
支持同样的配置文件。
.profile
任何想要定制由系统管理员提供的默认环境的用户都可以创建或修改.profile文件。这个文件通常定义或定制了环境变量,设置用户的终端,在登录过程时执行如date这样的程序。用户的应用同样也可以通过在.profile中的exec
applicationname来启动。在这种方式下,用户不会存取到shell提示符,并且,当应用程序退出,用户同时会退出登录。
/etc/profile
这个文件是一个对系统中的所有用户都有效的初始化文件,前提是这些用户使用的是Bourne,Korn,或者POSIX
shell.。系统管理员可以定制这个文件来提供所有的用户的一个一致的用户环境。普通的用户一般没有权限更改这个文件,用户定制他们自己的环境
只能通过自己的.profile和.kshrc文件
.kshrc
POSIX和K
shell都有一个可选的叫做.kshrc的配置文件。它的作用同.profile一样是配置你的用户环境,同.profile不同的是,.kshrc是在每次你启动一个新的shell时被读取。而不仅仅是在登录的时候。这种方式允许在每次你启动一个新的shell地时候设置你的别名或甚至提示符。在象X11
windows这种环境中,你可能同时运行几个shell,你可以使用.kshrc文件,这样,每一个shell看上去都是一样的。
.kshrc这个文件名不是一个必须的文件名。当你激活一个shell,它会通过ENV这个变量来索引这个文件。这个文件通常都是.kshrc,但它也可以使用其他的名字。
ENV=~/.kshrc
export ENV
这会告诉K shell你使用你的home目录下的.kshrc文件,现在就可以在..kshrc中加入你的别名和命令。
如果你同时使用Bourne 和POSIX shell,你可以存储POSIX shell的环境变量到这个文件中,因为Bourne
shell不会读这个文件。
.cshrc 和 .login
当你使用C shell作为你的登录的shell的时候,C shell 会在你的home
目录下找一个.login地文件。如果找到,在shell提示符出现之前,这个文件中的命令就会被执行。这和POSIX,Korn,和
Bourne shell中的.profile的用法完全一样。如果文件存在,文件.cshrc中的命令也会被执行。
6.13 shell内部命令和unix命令
shell内部命令是内建在shell中的命令
例如:
?cd
?ls
?pwd
?echo
unix命令存在在/usr/bin下。
例如:
?more
?file
一些“内部”命令同样可以作为“单独”的命令使用。
系统使用PATH变量来确定UNIX命令的位置
一些你通过键盘键入的命令是系统中的一个文件,例如在/usr/bin下的文件,这些命令都是unix命,但由许多的命令,例如 cd ,pwd
,echo 实际上是shell内部自带的命令。这些命令在unix文件系统中并不存在,这些命令就叫做shell内部命令。
由于unix命令可能存在在几个目录下,shell必须知道到什么地方去找这些命令。PATH变量就是shell查找命令的目录的位置。
Unix命令可以与shell内部命令同名,为了使用这些命令,用户必须在这些命令前加上其绝对路径名,以免同同名的内部命令冲突。
6.14 查找命令-whereis
UNIX命令主要存在在四个目录:/sbin,./usr/bin,/usr/local/bin,和/usr/contrib/bin。Whereis
命令主要在这些目录下查找命令所在的位置。许多的用户在他们的登录目录下有自己的bin 目录。whereis
命令不会去查找这些路径。有时你忘记命令的路径和命令的手册的位置。UNIX系统通过whereis 命令来定位命令和手册在系统中的位置。
Whereis 命令接受单一的参数就是命令的名字。它返回的结果是可执行代码的位置和命令的手册页。
阅读(875) | 评论(0) | 转发(0) |