shell 设置环境变量的问题

2017-03-24 12:57:01 +08:00
 lancegin

遇到一个不能理解的问题

在 shell 脚本中设置环境变量,执行脚本之后环境变量未生效,但在 terminal 手动 source 一下 bashrc 之后就生效了

部分 shell 脚本如下:

#!/bin/bash
.
.
.
DS_KEYFROM="xxx"
DS_KEY="xxx"
echo "export DS_KEYFROM=\"$DS_KEYFROM\"" >> ~/.bashrc
echo "export DS_KEY=\"$DS_KEY\"" >> ~/.bashrc
source ~/.bashrc
.
.
.

执行脚本之后echo $DS_KEYFROMecho $DS_KEY都没有值

但是查看 bashrc cat ~/.bashrc是显示已经设置成功的:

.
.
.
export DS_KEYFROM="xxx"
export DS_KEY="xxx"
.
.
.

此时如果手动 source 一下 bashrc source ~/.bashrc,环境变量就生效了。

有人知道怎么解决这个问题吗?如何直接执行脚本之后就让环境变量生效?

7292 次点击
所在节点    程序员
30 条回复
zzlyzq
2017-03-24 23:04:25 +08:00
子进程无法影响到父进程的环境变量
zzlyzq
2017-03-24 23:04:48 +08:00
父进程可以通过 export xx=xx 影响子进程的环境变量
thekll
2017-03-25 03:56:17 +08:00
@lancegin 我上一条回复中间一句有问题,请忽略。(不经常用,有些概念就模糊了。)
julyclyde
2017-03-25 08:41:06 +08:00
@zzlyzq 错。是通过 export 为尚未启动的子进程准备初始环境变量
lancegin
2017-03-25 11:51:51 +08:00
@julyclyde 请问下,如果在用户下的 bashrc 中 export 了环境变量,那重开一个 shell 的时候为什么也无效? login 的时候不是应该要加载一次 bashrc 的吗
shalk
2017-03-25 12:34:21 +08:00
@lancegin 参考 pyenv rvm 等 一些包管理工具的做法;

curl url | bash -

之后,修改了 bashrc , 或者提示你 把一些内容加到 bashrc 里,但是当前 shell 不会生效。

所以需要,重开窗口,或者 exec $SHELL -l
lancegin
2017-03-25 12:49:31 +08:00
@shalk 嗯 我现在将脚本中的 source 语句删掉了 执行脚本完之后抛出一个 source bashrc 的提醒
julyclyde
2017-03-25 13:17:04 +08:00
@lancegin 你“重开”的那个 shell 是怎么开的? man bash 看 INVOCATION 那一段核对一下具体是哪一种
lancegin
2017-03-26 01:19:15 +08:00
@julyclyde 后来发现是 zsh 导致,默认加载了 zshrc ,我在 zshrc 里面 source 了 bashrc 就没问题了
julyclyde
2017-03-26 21:28:30 +08:00
@lancegin 不错,总算是找到原因并解决了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/350007

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX