Chapter 10 Environment
Local variable
subshell
当你在login shell中执行一段程序文件时,会启动一个新的shell来执行,即subshell。
subshell有自己独立的环境,所以无法获取在parent shell中定义的局部变量,自然也无法改变其值
exported variable
通过使用export命令,可以使subshell获取parent shell中的变量。
当变量被export后则subshell可以获取该变量的一个副本,在subshell中所做的任何更改只存在其自己的环境中,
不会改变parent shell中相应变量的值
被export的变量在subshell中会自动被export,从而传递给更下一层的subshell
export -p
export -p命令可以显示当前环境中所有被export的变量及他们的值
PS1 and PS2
变量PS1中保存了当前环境中表示command prompt符号的值。你可以任意修改其值,但是修改只在当前环境有效
同样变量PS2中保存了secondary command prompt。
HOME
你登录时所在的目录路径会在启动login shell时自动被保存在HOME变量中。
同样你可以任意修改该变量的值,但是修改只在当前环境有效
PATH
当你执行一个程序时,shell会在PATH中保存的所有路径中按顺序依次寻在改程序,如果寻找到则运行程序
your current directory
当前目录也属于shell环境,所以在subshell中进行的修改并不会影响到parent shell。其值一直保存在变量PWD中
CDPATH
CDPATH和PATH类似,只不过它时在执行cd命令时所查找的目录。
不同的是CDPATH并不会在你启动shell是被自动赋值,通常需要用户手动去赋值
more on subshell
. 命令
. file
.会使其后所执行的命令使在当前shell中进行的,而不会启动一个独立的subshell。
在shell中启动一个新shell可以建立一个独立的shell环境,在退出返回时新shell中的各种局部变量都会自动消失
而且不像subshell缺乏交互环境。使用ctrl + d可以退出新shell
示例:
HOME=/usr2/data
BIN=$HOME/bin
RPTS=$HOME/rpts
DATA=$HOME/rawdata
PATH=$PATH$BIN
CDPATH=:$HOME:$RPTS
PS1="DB: "
export HOME BIN RPTS DATA PATH CDPATH PS1
# start up a new shell
/bin/sh
exec 命令
exec program
TBD
(...)与{ ...; }
()和{}可以将其中的命令作为一组命令执行。不同的是()中的命令是在subshell中执行的,
{}中的命令是在当前shell中执行的
向subshell中传递变量的其它方式
在运行程序的同一行定义的变量,会自动被export
x=100 foo
(x=100; export x; foo)
以上两条语句等价
.profile文件
在启动shell时系统会读取两个特殊文件,/etc/profile和用户主目录下的.profile
你可以修改.profile,在其中定义一些你自己独特的环境参数
TERM
TERM变量表示你所使用的terminal的配置,一些命令(vi等)需要用到
TZ
TZ表示Time Zone
