当我使用终端执行导出路径时,它会保存到哪个文件?

当我使用终端执行导出路径时,它会保存到哪个文件?

例如,当我运行导出export PATH=$PATH:$GOROOT/bin:$GOPATH/binGOPATH=~/workspace/me/go将其添加到哪个文件时?

答案1

当你export使用变量时,它没有被添加到任何地方的任何文件中

与仅仅分配变量相比,的效果export是将变量传递到所有 shell 子进程的环境中。它不会执行任何其他操作;它不会修改任何 shell 配置文件。在 shell 及其所有子进程退出后,导出的变量就消失了!当您打开一个不是第一个 shell 的子 shell 的新 shell 时,该 shell 将不会记住您的变量。

事实上,不需要exportPATH,因为 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/environmentUbuntu 上唯一默认设置的变量。我建议不是编辑/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

相关内容