|
|
发表于 2005-7-21 09:33:47
|
显示全部楼层
SHLVL变量表示当前shell是第几层,比如刚登陆时的
SHLVL是1,在提示符输入bash, 就是在shell内又派生了一个shell,后者
是前者的子进程,这时SHLVL变为2,输入exit,退出第二个shell,回到
第一个shell,SHLVL恢复为1。
子进程会继承父进程中*导出的*变量(无所谓“环境”二字):
export VAR=value中export的作用就是说把这个变量定义暴露给此进程
派生的进程,就是说
bash1>var=value
bash1>bash
bash2>echo $var
# var没有定义
bash2>exit
bash1>export var=value
bash1>bash
bash2>echo $var
# 派生的bash是第一个bash的子进程,它能看到var的定义
bash2>exit
bash1>
所以我们常见到在.bash_profile和.bashrc中声明环境变量时前面加了
export(对于csh似乎是用env),这样这个shell派生的子进程以及子子
进程都能看到这些定义。
Post by dieken_qfz
dieken:/home/dieken# set | grep -i lc_
LC_ALL=zh_CN.UTF-8
dieken:/home/dieken# bash
dieken:/home/dieken# echo $SHLVL
3
dieken:/home/dieken# set | grep -i lc_
LC_ALL=zh_CN.UTF-8
dieken:/home/dieken# export LC_ALL=en_US
dieken:/home/dieken# set | grep -i lc_
LC_ALL=en_US
_=LC_ALL
dieken:/home/dieken# echo $SHLVL
3
dieken:/home/dieken# exit
exit
dieken:/home/dieken# echo $SHLVL
2
dieken:/home/dieken# set | grep -i lc_
LC_ALL=zh_CN.UTF-8
===========
这样就可以用run.sh "mycommand&"
--->
# run.sh
export LC_ALL=en_US
$@
<---
$@的意思是所有命令行参数,比如
run.sh "foobar; hello; world&"
这个命令就开了一个新的shell(run.sh由一个派生shell解释执行),
在这个shell内重新定义了变量LC_ALL并导出给这个派生的shell的子进程
以及子子进程, 并执行命令"foobar; hello; world&"
加入&的用意是是让这些命令后台执行,而这个派生的shell可以马上退出,然后
用户可以在原先的shell里继续输入命令了,而且随后在这个shell里面是用的LC_ALL
仍然是最初设置的那个值。
注意:run.sh后面的命令要用引号括起来,否则就会把;和&和重定向符号解释为
用于当前shell的。 |
|