$ 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
当你
export
是一个变量时,它不会被添加到任何地方的任何文件中。的效果
export
,而不是仅仅分配一个变量,是将变量传递到所有 shell 子进程的环境中。它不做任何其他事情;它不会修改任何 shell 的配置文件。在 shell 及其所有子进程退出后,导出的变量就消失了!当您打开一个不是第一个 shell 的子 shell 的新 shell 时,该 shell 不会记住您的变量。事实上,不需要
export
PATH,因为 PATH 已经是一个环境变量。它已经导出;它会自动传递到子进程的环境中,当您更改它时,子进程也会继承更改。您可以使用
printenv
打印环境变量的命令来查看:(现在我需要退出那个 shell 来取回我的 PATH,或者
source /etc/environment
,因为我从这个 shell 启动的任何新 shell 都将继承我搞砸的那个 PATH 变量......)如果要永久设置任何变量,则需要自己将其添加到 shell 的配置文件之一。
据我所知,PATH 是唯一
/etc/environment
在 Ubuntu 上默认设置的变量。我建议不要编辑/etc/environment
来设置 PATH,或者如果你这样做了,请小心备份原始文件,因为你没有其他方法可以恢复原始 PATH(除非你把它写在某个地方或有一个很棒的记忆) . 另请注意,不会对内容执行扩展,因此您必须使用完整路径,而不是$PATH
or$GOPATH
or~
。如果你写这样的东西,它们将在 PATH 中,如果你的 PATH 是字面上的$PATH:~/workspace/me/go
,你将无法运行任何命令(除了那些内置在 shell 中的命令)而不使用它们的完整路径。我也不建议将 PATH 设置为
.bashrc
,因为每个交互式 Bash shell 都会读取.bashrc
,并且从 shell 启动一个新的 shell 是很常见的,依此类推......如果你放类似的东西在您的 PATH 中
.bashrc
,您会发现它/home/user/foo
被多次附加到您的 PATH 中;每次外壳启动外壳时,PATH 都会再次扩展。这最终可能会使事情变慢,特别是如果您添加了很多路径。此外,只有交互式 Bash shell read~/.bashrc
,所以如果你使用 Bash 以外的 shell,或者运行脚本,而不是交互式 Bash shell 的子进程,它不会有这个变量。相反,我建议添加一行
~/.profile
来扩展您的 PATH。这个文件只能被登录 shell 读取;通常,当您登录会话时,它只会被读取一次,因此 PATH 只会被附加一次,并且所有 shell 都将继承在那里设置的环境变量,而不仅仅是交互式 Bash shell。通常将环境变量添加到此文件。因此,您可以~/.profile
在文本编辑器中打开,并添加类似以下内容的行:如图所示引用路径是个好主意,以防任何目录包含特殊字符(创建名称中没有特殊字符的目录也是一个好主意,但是,事情发生了),如果你引用它,因为双引号 ( ) 抑制波浪号扩展,所以不能
~
用作快捷方式,但您可以改用,因为参数扩展仍在执行并将变为./home/user
"
$HOME
$HOME
/home/user
编辑后,保存文件并退出,注销并重新登录,或运行
source ~/.profile
,您的 PATH 将始终包含/home/user/workspace/me/go
.Shell custiomizations 通常被编辑成
$HOME/.bashrc
,它是sourced
由您启动的每个 shell 编写的。阅读man bash
。顺便说一句,你必须有
GOPATH
定义使用前
GOPATH
另外, 的定义在
GOROOT
哪里?