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