您的位置:首页 > 运维架构 > Shell

Shell基础与Profile

2012-04-08 18:31 120 查看
什么是shell

shell 是一个交互性命令解释器。Shell 独立于操作系统,这种设计让用户可以灵活选择

适合自己需要的shell。shell让你在命令行键入命令,经过shell解释后传送给操作系统(内

核)执行。

以下是 shell功能的一个汇总:

l 查找命令的位置并且执行相关联的程序

l 为shell变量赋新值

l 执行命令替代

l 处理 I/O 重定向和管道功能

l 提供一个解释性的编程语言界面,包括tests,branches 和loops 等语句

当你登录到一个unix 系统,shell 会为你的终端登录线索定义一些特征,然后出现你的

提示符。在POSIX,Bourn,K shell中$符号为默认的提示符。C shell中默认的提示符是%号。

通常使用的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。

用户环境

语法:

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中设置。

设置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。

变量名限制

变量名必须由字母开始可以包含字母,数字。下划线,变量名所包含的字符的数量没有

限制。

两个重要的变量

PATH 变量

-shell搜寻你键入的命令所在位置的一个目录的列表

TERM变量

-描述你的终端类型和屏幕尺寸(为你运行的程序需要)

$ 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变量中的值来重新设定你的终端类型。

常用的变量赋值

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文件,并使用恰当地终端类型来映射你的终

端的端口。这在你的系统联接有不同型号的终端的时候十分有用。

登录过程

当你坐下来开始在系统中工作,你会在屏幕上看见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提示符。

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 中的

命令也会被执行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息