LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1994|回复: 8

如何通过脚本来导入bash环境变量?

[复制链接]
发表于 2007-7-14 21:35:34 | 显示全部楼层 |阅读模式
在脚本中的变量只对自己和子shell起作用,如何能用脚本来修改环境变量,也就是脚本执行完后在bash中仍有该变量?
在~文件夹下放入一个.variable文件
  1. #! /bin/sh
  2. export linuxsir=1
复制代码
然后在一个用一个shell脚本
  1. #! /bin/sh
  2. source ~/.variable
复制代码
为什么在bash中不起作用呢,而仅仅在bash中用source ~/.variable却可以,为什么呢


[color="RED"]用google查了查,好像是不能通过shell脚本来修改父shell的变量的
发表于 2007-7-15 16:32:34 | 显示全部楼层
你执行第二个脚本还不是在子shell里么...
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-16 07:18:25 | 显示全部楼层
Post by Jockey
你执行第二个脚本还不是在子shell里么...

对呀,但我想怎么才能将子shell中的变量设为环境变量,能吗
回复 支持 反对

使用道具 举报

发表于 2007-7-16 23:27:17 | 显示全部楼层
可以
a=$(echo 2)
把echo的标准输出符给了变量a.
同理,任何程序里面,echo/cat/其它任何方法送到标准输出都可以用a=$(程序)送给a当变量.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-17 06:57:09 | 显示全部楼层
Post by lastart
可以
a=$(echo 2)
把echo的标准输出符给了变量a.
同理,任何程序里面,echo/cat/其它任何方法送到标准输出都可以用a=$(程序)送给a当变量.

但是它不能把变量转给父shell呀,也就是说,是不是子shell中的变量永远也不能影响父shell,可以这么说吗
回复 支持 反对

使用道具 举报

发表于 2007-7-17 09:16:57 | 显示全部楼层
Q5: 怎样把子shell中的变量传回父shell?
A: 例如(echo "$a") | read b不能工作,如何找到一个替代方案?下面给出一些可能的方案:
1.使用临时文件
...
#in subshell
a=100
echo "$a">tmpfile
...
#in parent
read b<tmpfile

2.使用命名管道
mkfifo pipef
(...
echo "$a" > pipef
...)
read b <pipef

3.使用coprocess(ksh)
( echo "$a" |&)
read -p b

4.使用命令替换
b=`echo "$a"`

5.使用eval命令
eval `echo "b=$a"`

6.使用here document
read b <<END
`echo "$a"`
END

7.使用here string(bash/pdksh)
read b <<<`echo "$a"`

8.不用子shell,用.命令或source命令执行脚本。
即在当前shell环境下执行脚本,没有子shell,也就没有了子shell的烦恼。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-17 11:30:07 | 显示全部楼层
Post by zhy2111314
Q5: 怎样把子shell中的变量传回父shell?
A: 例如(echo "$a") | read b不能工作,如何找到一个替代方案?下面给出一些可能的方案:
1.使用临时文件
...
#in subshell
a=100
echo "$a">tmpfile
...
#in parent
read b<tmpfile

2.使用命名管道
mkfifo pipef
(...
echo "$a" > pipef
...)
read b <pipef

3.使用coprocess(ksh)
( echo "$a" |&)
read -p b

4.使用命令替换
b=`echo "$a"`

5.使用eval命令
eval `echo "b=$a"`

6.使用here document
read b <<END
`echo "$a"`
END

7.使用here string(bash/pdksh)
read b <<<`echo "$a"`

8.不用子shell,用.命令或source命令执行脚本。
即在当前shell环境下执行脚本,没有子shell,也就没有了子shell的烦恼。


学习!
有没有这种方式,把shell中的变量设为变量,整个系统都可以使用,比如我退出现在这个shell,重新打开一个,或者是系统的一个脚本要引用这个变量,这个变量为系统共用,就相当于运行一次.bash_profile,里面有这个变量的定义
回复 支持 反对

使用道具 举报

发表于 2007-7-17 13:01:48 | 显示全部楼层
两种方式可以实现你的要求:
  1. source script.sh
  2. . script.sh
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-7-26 16:32:27 | 显示全部楼层
source script.sh
. script.sh

把上面一种添加到你的 ~/.bashrc 中,就可以了,每次你打开一个terminal 都会有
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表