11 章 环境

本文介绍了在Unix系统中,shell如何管理和维护用户的环境,并详细解释了如何通过导出变量来影响子shell及其执行的程序。文章还探讨了如何设置和使用PATH、HOME等关键变量,以及如何利用特殊命令如.db来简化目录导航。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

11 环境
登录系统后,实际上被分配了一份shell程序的副本,该shell维护着你的环境--一个区别于系统中其他用户的环境。
从登录入系统的那一刻起,这个环境就被维护着,知道你从系统注销为止。

export variables
其中variables是你希望导出的变量名的清单,对从这一个以后执行的所有
子shell,这些导出的变量的值都会传递给它们。

子shell甚至不能改变导出变量的值,它只不过是改变了y的副本的值,
该副本是在程序执行时传递给子shell环境的。就跟局部变量一样,子shell结束时,
导出变量的值也丢失了。子shell中没有办法改变父shell中的变量。

shell用来作为命令提示符显示的字符存在变量PS1中,可以把这个变量改变成
任何字符。辅助命令提示符存在变量PS2中。
它们跟其他shell变量一样,要想永久性的修改,可以把它加入.profile文件,自动进行改动。
使用echo $PS1 $PS2可显示这两个变量。

每次登录系统后所处的目录称为宿主目录。有一个特殊的变量名叫HOME.
使用 echo $HOME可显示宿主目录。

每当键入要执行的程序名时,shell就从一连串的目录中搜索,直到找到要求的程序为止。
如果找到,就启动运行。这一连串目录的清单存在一个特殊的shell变量PATH中。

.:/bin:/usr/bin和:/bin:/usr/bin是等价的,指明当前目录的点是可选的。不建议将点放在最前面,
为了防止特洛伊木马。

随时可以给要执行的程序指定路径,这样可以覆盖PATH的作用。
例如,如果键入/bin/date,shell就会直接在/bin目录中执行date,在这
种情况下,PATH的值被忽略,就跟键入../bin/lu(退出当前目录进入bin)或者./rolo一样。
后一种情形是要在当前目录中执行rolo程序。

CDPATH变量跟PATH变量相似:它给出一系列目录,每当shell执行cd命令时,shell就在其中
搜索。只有当参数给出目录不是完全路径名并且CDPATH的值不为空时才进行这种搜索。

shell有个内部命令称作.,它的一般格式是:
.file
它的作用是在当前shell中运行file的内容,也就是由当前shell来执行file
中的命令,就像在那个位置直接键入它们一样,不产生子shell来执行这些程序。
shell用PATH变量来查找file,就跟执行其他程序一样。

假如有一个程序名为db,它包含以下命令:
$cat db
DATA=/usr2/data
RPTs=$DATA/rpts
BIN=$DATA/bin
cd $DATA

如果你是那种需要支持一些不同目录层次结构的Unix用户,可以创建像db这样的程序,
每当要在其中一个目录中工作时,就执行一个这样的程序。在那个程序中,还可以定义
其他变量:例如:你可能想改变PS1中的提示符,比如改成DB--这样可以让你知道数据库
的变量已经建立了;你也可能希望改变PATH,把包含跟数据库有关的程序的目录加入进去,
以及改变CDPATH变量,以便方便地用cd命令存取数据库的目录;
甚至可以改变HOME,这样只要用cd命令,不用参数就可以直接转到数据库目录。
如果做了这样的修改,你可能会希望在子shell中运行db,而不是在当前shell中,
因为如果在当前shell中运行的话,有关数据库的工作完成后,这些变量仍然保留着。
正确处理的诀窍是从子shell中启动一个新shell,将所有修改过的变量导出给它,与数据库
相关的工作结束后,按Ctrl+d从这个新shell中注销。
$cat db
#Set up and export variables related to the data base
HOME=usr2/data
DATA=/usr2/data
RPTS=$DATA/rpts
BIN=$DATA/bin
PATH=$PATH$BIN
CDPATH=:$HOME:$RPTS

PS1="DB: "

export HOME BIN RPTS DATA PATH CDPATH PS1
#Start up a new shell
/usr/bin/sh
$
首先把宿主目录设为usr2/data,然后相对于宿主目录定义变量
BIN,RPTS,DATA(在需要把目录结构移到别处的情况下,这样做
是个最好的办法,程序中惟一需要修改的就是HOME变量)。
接着,修改PATH变量,将数据库的bin目录包含进去:设置CDPATH目录,
使它包含当前目录,宿主目录和RPTS目录。
导出这些变量之后(把这些变量导入以后产生的子shell的环境中必须这样做),
就启动标准shell,/usr/bin/sh,从这一时刻起,就由新shell处理终端
键入的命令。向该shell键入Ctrl+d后,控制返回到db,接着控制又返回到登录shell。
$db 运行
DB: echo $HOME
usr2/data
DB: Ctrl+d
$ echo $HOME
/users/steve 返回到正常状态
$

-----------------------------------------------------
exec命令

可以把一系列命令用小括号或大括号括起来,使他们组成一组。
前一种形式用子shell执行这些命令,后一种形式则在当前shell
中执行。
如果大括号中括的命令要打在同一行,左括号后必须有一个空格。

给子shell传递变量的另一种方法
在命令行中,可以在命令名之前给任意多个变量赋值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值