登录环境

来源:互联网 发布:ubuntu matlab2015b 编辑:程序博客网 时间:2024/04/28 17:51

登录环境

1、登录环境

登录系统时,在进入命令提示符前,系统要做两个工作。键入用户名和密码后,系统检

查是否为有效用户,为此需查询/etc/passwd文件。如果登录名正确并且密码有效,开始下一

步过程,即登录环境。

在进行下一步处理之前,先看看文件/etc/passwd。这是一个文本文件,可以任意修改其中的文本域,但要小心。此文本有7个域,并用冒号作分隔符,第1域是登录名,第2域是加密的密码,第5域是用户全名。第6域是用户根目录,第7域是用户使用的shell。这里/bin/sh意即缺省为常规Bourne Shell

登录成功后,系统执行两个环境设置文件,第一个是/etc/profile,第二个是.profile,位

于用户根目录下。系统还会处理其他的初始化文件。这里只涉及profile文件。

1.1/etc/profile

用户登录时,自动读取/etc目录下profile文件,此文件包含:

全局或局部环境变量。

PAT H信息。

终端设置。

安全命令。

日期信息或放弃操作信息。

设置全局环境变量便于用户及其进程和应用访问它。PATH定位包含可执行文件,库文件及一般文本文件的目录位置,便于用户快速访问。终端设置使系统获知用户终端的一般特性。安全命令包括文件创建模式或敏感区域的双登录提示。日期信息是一个文本文件,保存用户登录时即将发生事件的记录或放弃登录的信息文件。

1.2、用户的$HOME.profile

/etc/profile文件执行时,用户将被放入到自己的$HOME目录中,回过头来观察passwd文件,用户的$HOME目录在倒数第2列。可以将之看作用户根目录,因为正是在这里存储了所有的私有信息。一般来说创建帐户时,一个profile文件的基本框架即随之创建。不要忘了在.profile文件中可以通过设置相关条目以不同的值或使用uset命令来覆盖/etc/profile文件中的设置。

2、环境和shell变量

为使shell编程更有效,系统提供了一些shell变量。有两种变量,本地和环境。严格地说可以有4种,但其余两种是只读的,可以认为是特殊变量,它用于向shell脚本传递参数。

2.1、什么是shell变量

变量可以定制用户本身的工作环境。使用变量可以保存有用信息,使系统获知用户相关

设置。变量也用于保存暂时信息。例如:一变量为EDITOR,系统中有许多编辑工具,但哪一个适用于系统呢?将此编辑器名称赋给EDITOR,这样,在使用cron或其他需要编辑器的应用时,这就是你将一直使用的EDITOR取值,并将之用作缺省编辑器。

2.2、本地变量

本地变量在用户现在的shell生命期的脚本中使用。例如,本地变量file-name取值为loop.doc,这个值只在用户当前shell生命期有意义。如果在shell中启动另一个进程或退出,此值将无效。

要设置一本地变量,格式为:

$variable-name=value

注意,等号两边可以有空格。如果取值包含空格,必须用双引号括起来。shell变量可以用大小写字母。

变量设置时的不同模式:

Variable-name=value      设置实际值到variable-name

Variable-name+value      如果设置了variable-name,则重设其值

Variable-name:?value      如果未设置variable-name,显示未定义用户错误信息

Variable-name?value       如果未设置variable-name,显示系统错误信息

Variable-name:=value      如果未设置variable-name,设置其值

Variable-name:-value      同上,但是取值并不设置到variable-name,可以被替换

2.2.1、显示变量

使用echo命令可以显示单个变量取值,并在变量名前加$

2.2.2、清除变量

使用unset命令清除变量。

unset variable-name

2.2.3、显示所有本地shell变量

使用set命令显示所有本地定义的shell变量。

2.2.4、结合变量值

将变量并排可以使变量结合在一起:

echo ${var1}${var2}

2.2.5、测试变量是否已经设置

有时要测试是否已设置或初始化变量。如果未设置或初始化,就可以使用另一值。此命

令格式为:

${variable:-value}

意即如果设置了变量值,则使用它,如果未设置,则取新值。

注意:并没有将实际值传给变量,需使用下述命令完成此功能:

${variable:=value}

也可以编写脚本测试变量是否取值,然后返回带有系统错误信息的结果。下面的例子测

试变量file是否取值。以上结果可读性不好,但是可以加入自己的脚本以增加可读性。

    ${variable:?}

2.2.6、使用变量来保存系统命令参数

可以用变量保存系统命令参数的替换信息

2.2.7、设置只读变量

如果设置变量时,不想再改变其值,可以将之设置为只读方式。如果有人包括用户本人

想要改变它,则返回错误信息。格式如下:

variable-name=value

readonly variable-name

要查看所有只读变量,使用命令readonly即可。

2.3、环境变量

环境变量用于所有用户进程(经常称为子进程)。登录进程称为父进程。shell中执行的用户进程均称为子进程。不像本地变量(只用于现在的shell)环境变量可用于所有子进程,这包括编辑器、脚本和应用。

环境变量可以在命令行中设置,但用户注销时这些值将丢失,因此最好在.profile文件中定义。系统管理员可能在/etc/profile文件中已经设置了一些环境变量。将之放入profile文件意味着每次登录时这些值都将被初始化。

传统上,所有环境变量均为大写。环境变量应用于用户进程前,必须用export命令导出。环境变量与本地变量设置方式相同。

2.3.1、设置环境变量

VARIABLE-NAME=valueexport VARIABLE-NAME

在两个命令之间是一个分号,也可以这样写:

VARIABLE-NAME=value

Export VARIABLE-NAME

2.3.2、显示环境变量

显示环境变量与显示本地变量一样:

echo $variable

使用env命令可以查看所有的环境变量。

2.3.3、清除环境变量

使用unset命令清除环境变量:

unset variable

2.3.4、嵌入shell变量

Brourne shell 有一些预留的环境变量名,这些变量名不能用作其他用途。通常在/etc/profile中建立这些嵌入的环境变量,但也不完全是,这取决于用户自己。以下是嵌入shell

变量列表。

1CDPATH

改变目录路径变量,保留一系列由冒号隔开的路径名,用于cd命令。如果设置了CDPATHcd一个目录时,首先查找CDPATH,如果CDPATH指明此目录,则此目录成为当前工作目录。

2EXINIT

EXINIT变量保存使用vi编辑器时的初始化选项。例如,调用vi时,要显示行号,且在第10个空格加入tab键,命令为:

$ EXINIT='set nu tab=10';export EXINIT

3HOME

HOME目录,通常定位于passwd文件的倒数第2列,用于保存用户自身文件。设置了

HOME目录,可以简单使用cd命令进入它。

4IFS

用作shell指定的缺省域分隔符。原理上讲域分隔符可以是任意字符,但缺省通常为空

格、新行或tab键。

5LOGNAME

此变量保存登录名,应该为缺省设置,但如果没有设置,可使用下面命令完成它:

6MAIL

MAIL变量保存邮箱路径名,缺省为/var/spool/mail/<login name>shell周期性检查新邮

件,如果有了新邮件,在命令行会出现一个提示信息。如果邮箱并不在以上指定位置,可以

MAIL设置。

$ MAIL=/usr/mail/daveexport MAIL

7MAILCHECK

MAILCHECK缺省每60s检查新邮件,但如果不想如此频繁检查新邮件,比如设为每2 m,使用命令:

$ MAILCHECK=120export MAILCHECK

8MAILPATH

如果有多个邮箱要用到MAILPATH,此变量设置将覆盖MAIL设置。

$ MAILPATH=/var/spool/dave:/var/spool/ae;dxmpionrt MAILPATH

9PATH

PATH变量保存进行命令或脚本查找的目录顺序,正确排列这个次序很重要,可以在执行命令时节省时间。通常情况,最好首先放在HOME目录下,接下来是从最常用到一般使用到不常用的目录列表次序。如果要在当前工作目录下查询,无论在哪儿,均可以使用句点操作。目录间用冒号分隔,例如:

$PATH=$HOME/bin:.:/bin:/usr/binexport PATH

使用上面的例子首先查找HOME/bin目录,然后是当前工作目录,然后是/bin,最后是

/usr/bin

PATH可以在系统目录下/etc/profile中设置,也可以使用下面方法加入自己的查找目录。

$PATH=$PATH:/$HOME/bin:.export PATH

这里使用了/etc/profile中定义的PATH,并加入$HOME/bin和当前工作目录。一般来说,

在查找路径开始使用当前工作目录不是一个好办法,这样很容易被其他用户发现。

10PS1

基本提示符包含shell提示符,缺省对超级用户为#,其他为$。可以使用任何符号作提示符

11PS2

PS2为附属提示符,缺省为符号>PS2用于执行多行命令或超过一行的一个命令。

12SHELL

SHELL变量保存缺省shell,通常在/etc/passwd中已设置,但是如有必要使用另一个shell,可以用如下方法覆盖当前shell

SHELL=/bin/sh;export SHELL

13TERMINFO

终端初始化变量保存终端配置文件的位置。通常在/usr/lib/terminfo/usr/share/terminfo

$TERMINFO=/usr/lib/terminfoexport TERMINFO

14TERM

TERM变量保存终端类型。设置TERM使应用获知终端对屏幕和键盘响应的控制序列类型,常用的有vt100vt200vt220-8等。

$ TERM=vt100 export TERM

15TZ

时区变量保存时区值,只有系统管理员才可以更改此设置。例如:

返回值表明正在使用格林威治标准时间,与G M T时差为0,并作E D T保存。

2.3.5set命令

$HOME.profile文件中设置环境变量时,还有另一种方法导出这些变量。使用set命令-a选项,即set -a指明所有变量直接被导出。不要在/etc/profile中使用这种方法,最好只在自己的$HOME.profile文件中使用。

2.3.6、位置变量参数

本章开始提到有4种变量,本地、环境,还有两种变量被认为是特殊变量,因为它们是只读的。这两种变量即为位置变量和特定变量参数。先来看一看位置变量。

如果要向一个shell脚本传递信息,可以使用位置参数完成此功能。参数相关数目传入脚本,此数目可以任意多,但只有前9个可以被访问,使用shift命令可以改变这个限制。参数从第一个开始,在第9个结束;每个访问参数前要加$符号。第一个参数为0,表示预留保存实际脚本名字。无论脚本是否有参数,此值均可用。

2.3.7、特定变量参数

既然已经知道了如何访问和使用s h e l l脚本中的参数,多知道一点相关信息也是很有用的,有必要知道脚本运行时的一些相关控制信息,这就是特定变量的由来。共有7个特定变量:

$#    传递到脚本的参数个数

$*    以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9

$$    脚本运行的当前进程ID

$!    后台运行的最后一个进程的进程ID

$@  $#相同,但是使用时加引号,并在引号中返回每个参数

$-    显示shell使用的当前选项,与set命令功能相同

$?    显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

2.3.8、最后的退出状态

注意,$?返回0。可以在任何命令或脚本中返回此变量以获得返回信息。基于此信息,可以在脚本中做更进一步的研究,返回0意味着成功,1为出现错误。

3、引号

shell引用类型:

" "    双引号

' '     单引号

    反引号

/      反斜线

3.1、双引号

使用双引号可引用除字符$`/外的任意字符或字符串。这些特殊字符分别为美元符号,反引号和反斜线,对shell来说,它们有特殊意义。

3.2、单引号

单引号与双引号类似,不同的是shell会忽略任何引用值。换句话说,如果屏蔽了其特殊含义,会将引号里的所有字符,包括引号都作为一个字符串。使用上一个例子,结果如下:

GIRL=’girl’

echo “The ‘$GIRL’ did well”

The ‘girl’ did well

3.3、反引号

反引号用于设置系统命令的输出到变量。shell将反引号中的内容作为一个系统命令,并执行其内容。使用这种方法可以替换输出为一个变量。反引号可以与引号结合使用。

3.4、反斜线

如果下一个字符有特殊含义,反斜线防止shell误解其含义,即屏蔽其特殊含义。下述字符包含有特殊意义:& * + ^ $ ` " | ?

在打印字符串时要加入八进制字符(ASCII相应字符),必须在前面加反斜线,否则shell

将其当作普通数字处理。

使用命令expr时,用*表示乘法会出现错误,在*前加上反斜线才会正确。