我们知道,我们可以更改 bash 的环境变量,例如PATH
,使用初始化脚本,例如.bashrc
。只需写下来PATH=<VALUE>
,你就会得到你想要的。
但是,考虑一下这个问题:
我们有一个名为的 bash 脚本rc
:
#!/bin/bash
mySite="superUser"
export mySite
echo "the value of mySite is: $mySite"
然后我们声明变量mySite
,执行rc
脚本,然后检查变量的值:
$ declare -x mySite="super"
$ ./rc
the value of mySite is: superUser
$ echo $mySite
super
该值仍然是super
。我们是否可以得出结论,子 shell 不能使用类似指令直接更改父 shell 的变量VARIALBENAME=VLAUE
?
我们的rc
脚本就像.bashrc
,我们如何通过将 放入PATH=<VLAUE>
其中来更改 bash 的环境变量的值,因为当.bashrc
的执行结束时,调用 shell 的变量仍然没有改变?
答案1
环境变量遗传...并且父进程不会从其子进程那里继承任何东西(它以相反的方向工作)。
在第一种情况下,读取 rc 文件的 bash 进程要么与您使用变量的进程相同,要么是其祖先。
在第二种情况下,读取文件的进程是 shell 的子进程。有 3 种方法可以解决这个问题:
- 让你的脚本启动新的shell,它继承了变量。退出时,原来的 shell 将恢复(使用原来的环境)
来源rc 脚本而不是执行它:
. ./rc
或者
source ./rc
指示当前 shell 读取脚本本身(而不是在子进程中执行)然后恢复
明确评估输出(
ssh-agent
例如通常这样做)eval `./rc`
其中 rc 已更改为
#!/bin/bash echo "export mySite=\"superUser\""