遇到一个不能理解的问题
在 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_KEYFROM
和 echo $DS_KEY
都没有值
但是查看 bashrc cat ~/.bashrc
是显示已经设置成功的:
.
.
.
export DS_KEYFROM="xxx"
export DS_KEY="xxx"
.
.
.
此时如果手动 source 一下 bashrc source ~/.bashrc
,环境变量就生效了。
有人知道怎么解决这个问题吗?如何直接执行脚本之后就让环境变量生效?
1
Dx2619 2017-03-24 13:01:11 +08:00 via iPhone
因为脚本执行的 shell 进程号和执行完脚步 echo 的进程号不一致呀。
|
2
Dx2619 2017-03-24 13:04:13 +08:00 via iPhone
@Dx2619 因为脚本执行的 shell 进程号和你在脚本使用过后 echo 时用的 shell 的进程号不一致。你在当前 shell 手工 source 一下或者开一个新的 shell 就可以了
|
4
lancegin OP @Dx2619
但现在我的需求就是在不手动 source 的前提下直接让环境变量生效,如体直接在 shell 脚本里面的 `source ~/.bashrc` ps 重开一个 shell 也是无效的 没有手动 source 的前提下 感觉就是没有设置成功的 |
5
lancegin OP @Dx2619 刚觉像是直接执行脚本的时候 开了一个子 shell ,于是我脚本中的 source 命令相当于在子 shell 中执行了
|
7
greyterry 2017-03-24 13:27:38 +08:00
1 楼正解
|
8
lancegin OP @imkh 如果这是个 install 脚本 有没有办法可以直接通过 raw 执行呢? 还是我必须得把脚本下载到本地之后再手动 source 执行?
|
9
imkh 2017-03-24 13:36:55 +08:00
|
12
thekll 2017-03-24 15:35:03 +08:00 via iPhone
感觉你好像并没理解楼上两位的意思。
https://en.m.wikipedia.org/wiki/Source_(command) |
13
thekll 2017-03-24 15:36:39 +08:00 via iPhone
直接 source 执行你的脚本。
|
14
lancegin OP @thekll 楼上说的都明白 只是没有解决我的问题 。我是希望不通过手动 source 执行就能解决问题,然而貌似并不行。
具体情况是这样 假设有一段 install 脚本放在 github 仓库上,那我可以用 `curl -s raw_file.sh | bash` 直接执行,但如果脚本里面有设置环境变量的语句,那就无法实现了 |
15
artandlol 2017-03-24 16:00:22 +08:00
要嘛是写死在
/etc/rc.local 然后 reboot 或者写在 /etc/profile 然后 source /etc/profile 要嘛只能在程序内部调用 不建议放在 bashrc ,因为定时任务的时候是没有登陆操作,没法加载你这个 bashrc |
18
21grams 2017-03-24 16:29:38 +08:00
所以你以为 source 是做什么用的
|
20
thekll 2017-03-24 22:16:28 +08:00 via iPhone
Bash 有好几种启动方式: login 、 interactive 等,相关的几个配置文件作用也有区别。
~/.bashrc 好像对于 Bash 脚本文件是不起作用的。 你可以试试~/.bash_profile 、~/.profile 。 具体说明请参考: https://en.m.wikipedia.org/wiki/Bash_(Unix_shell) |
21
zzlyzq 2017-03-24 23:04:25 +08:00
子进程无法影响到父进程的环境变量
|
22
zzlyzq 2017-03-24 23:04:48 +08:00
父进程可以通过 export xx=xx 影响子进程的环境变量
|
25
lancegin OP @julyclyde 请问下,如果在用户下的 bashrc 中 export 了环境变量,那重开一个 shell 的时候为什么也无效? login 的时候不是应该要加载一次 bashrc 的吗
|
26
shalk 2017-03-25 12:34:21 +08:00
@lancegin 参考 pyenv rvm 等 一些包管理工具的做法;
curl url | bash - 之后,修改了 bashrc , 或者提示你 把一些内容加到 bashrc 里,但是当前 shell 不会生效。 所以需要,重开窗口,或者 exec $SHELL -l |
27
lancegin OP @shalk 嗯 我现在将脚本中的 source 语句删掉了 执行脚本完之后抛出一个 source bashrc 的提醒
|
28
julyclyde 2017-03-25 13:17:04 +08:00
@lancegin 你“重开”的那个 shell 是怎么开的? man bash 看 INVOCATION 那一段核对一下具体是哪一种
|