![当我使用终端执行导出路径时,它会保存到哪个文件?](https://linux22.com/image/1155330/%E5%BD%93%E6%88%91%E4%BD%BF%E7%94%A8%E7%BB%88%E7%AB%AF%E6%89%A7%E8%A1%8C%E5%AF%BC%E5%87%BA%E8%B7%AF%E5%BE%84%E6%97%B6%EF%BC%8C%E5%AE%83%E4%BC%9A%E4%BF%9D%E5%AD%98%E5%88%B0%E5%93%AA%E4%B8%AA%E6%96%87%E4%BB%B6%EF%BC%9F.png)
例如,当我运行导出export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
或GOPATH=~/workspace/me/go
将其添加到哪个文件时?
答案1
当你export
使用变量时,它没有被添加到任何地方的任何文件中。
与仅仅分配变量相比,的效果export
是将变量传递到所有 shell 子进程的环境中。它不会执行任何其他操作;它不会修改任何 shell 配置文件。在 shell 及其所有子进程退出后,导出的变量就消失了!当您打开一个不是第一个 shell 的子 shell 的新 shell 时,该 shell 将不会记住您的变量。
事实上,不需要export
PATH,因为 PATH 已经是一个环境变量。它已经被导出;它将自动传递到子进程的环境中,当你改变它时,子进程也会继承这个变化。
您可以使用printenv
打印环境变量的命令来查看此内容:
$ foo=bar; echo $foo # set a variable
bar # the shell knows it
$ printenv foo # but it's not in the environment...
$ export foo; printenv foo # export the variable and check again
bar # there it is!
$ foo=new; printenv foo # change the variable
new # the change is inherited
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
$ PATH=/usr/bin; printenv PATH # printenv is in /usr/bin so keep that!
/usr/bin # the change was inherited
(现在我需要退出该 shell 以恢复我的 PATH,或者source /etc/environment
,因为我从该 shell 启动的任何新 shell 都将继承我弄乱的 PATH 变量......)
如果要持久设置任何变量,则需要自己将其添加到 shell 的配置文件之一中。
据我所知,PATH 是/etc/environment
Ubuntu 上唯一默认设置的变量。我建议不是编辑/etc/environment
以设置 PATH,或者如果这样做,请小心备份原始文件,因为您将没有其他方法恢复原始 PATH(除非您将其写下来或记忆力超群)。还请注意,不会对内容执行任何扩展,因此您必须使用完整路径,而不是$PATH
或$GOPATH
或~
。如果您写了这样的内容,它们将确实位于 PATH 中,并且如果您的 PATH 确实是$PATH:~/workspace/me/go
,您将无法运行任何命令(除了内置于 shell 中的命令),除非使用它们的完整路径。
我也不建议在中设置 PATH .bashrc
,因为每个交互式 Bash shell 都会读取.bashrc
,而且从 shell 启动一个新 shell 是很常见的,等等……如果你输入类似
PATH="$PATH:$HOME/foo"
在您的 中.bashrc
,您会发现/home/user/foo
多次附加到您的 PATH;每次 shell 启动 shell 时,PATH 都会再次扩展。这最终可能会使速度变慢,特别是如果您添加了很多路径。此外,只有交互式 Bash shell 会读取~/.bashrc
,因此如果您使用 Bash 以外的 shell,或者运行脚本,而它不是交互式 Bash shell 的子进程,它将没有这个变量。
相反,我建议添加一行来~/.profile
扩展您的 PATH。此文件仅由登录 shell 读取;通常,它只在您登录会话时读取一次,因此 PATH 只会附加一次,并且所有 shell 都会继承在那里设置的环境变量,而不仅仅是交互式 Bash shell。通常会将环境变量添加到此文件。因此,您可以~/.profile
在文本编辑器中打开并添加类似以下内容的行:
GOPATH="$HOME/workspace/me/go"
PATH="$PATH:$GOPATH/bin"
最好像图中这样用引号括起来,以防任何目录包含特殊字符(创建名称中不包含特殊字符的目录也是一个好主意,但是,事情总会发生),并且如果您确实引用了它,您不能将其用作~
快捷方式,/home/user
因为双引号("
)会抑制波浪符号扩展,但您可以改用,$HOME
因为参数扩展仍会执行并且$HOME
会变为/home/user
。
编辑后,保存文件并退出、注销并重新登录,或者运行source ~/.profile
,您的 PATH 将始终包含/home/user/workspace/me/go
。
答案2
Shell 自定义通常编辑到 中$HOME/.bashrc
,它sourced
由您启动的每个 shell 执行。请阅读man bash
。
顺便说一句,你必须有GOPATH
定义
GOPATH=~/workspace/me/go
使用前GOPATH
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
另外, 的定义在哪里GOROOT
?