Local variable

subshell

当你在login shell中执行一段程序文件时,会启动一个新的shell来执行,即subshellsubshell有自己独立的环境,所以无法获取在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

CDPATHPATH类似,只不过它时在执行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