如何在Linux/Unix上永久设置$PATH

1081
在Linux上,我如何将一个目录添加到$PATH中以使其在不同的会话中保持持久性?
背景: 我正在尝试将一个目录添加到我的路径中,以便它始终位于我的Linux路径中。我已经尝试过:
export PATH=$PATH:/path/to/dir

这样做是有效的,但每次退出终端并启动新的终端实例时,此路径都会丢失,并且我需要再次运行导出命令。

如何使其永久设置?


如果您使用的是Mac,则bashrc可以正常工作,无需不断地执行source ~/.profile以使终端从环境变量中读取。 - Jose Mhlanga
24个回答

7

你可以将这行代码添加到你的控制台配置文件中(例如,.bashrc或者.profile)。


2
我在/home/(用户名)中没有这两个文件。 - Ali
3
你使用哪种Shell?(以点号开头的文件是隐藏的,你需要像 ls -a 这样的命令才能看到它们。) - David Schwartz
如果您没有这些文件(bashrc或profile),您可以手动创建它们,它们将自动使用。 - trve.fahad

6

经过大量的研究,我找到了一个简单的解决方案(我正在使用 Elementary OS ),受到Flutter-Linux-Ubuntu上逐步安装的启发。

Run the following command to open the .bashrc file in edit mode. (You may also use vi or any other editor).

~$ sudo nano ~/.bashrc

Add the following line at the end of the file and save.

export PATH="[FLUTTER_SDK_PATH]/flutter/bin:$PATH"

For example:

export PATH="/home/rageshl/dev/flutter/bin:$PATH"

enter image description here

我相信这是在Ubuntu发行版中设置Flutter路径的永久解决方案。


1
你可能应该删除“sudo”这个命令。把它改成nano ~/.bashrc就可以了。 - reubano

5

可以直接使用以下命令进行添加:

echo 'export PATH=$PATH:/new/directory' >> ~/.zshrc
source ~/.zshrc

3
这个问题标记为“bash”,但这并没有什么帮助。 - Laurenz Albe
3
这是一个有效的答案 -> 标题仅提到了Linux,所以bash和zsh都可以使用...如果标记只有“bash”,我们需要将“zsh”也添加到标签中。 - Carlos Saltos

5

添加一个永久路径的方法是:

我使用的方法如下:

cd /etc/profile.d
touch custom.sh
vi custom.sh 
export PATH=$PATH:/path according to your setting/

重新启动您的计算机,然后就可以了;路径将会永久存在。


2
您实际上不需要重新启动计算机。注销并重新登录即可。这是一种非常优雅的解决方案,因为它非常容易撤消任何更改,而无需编辑文件。还可以轻松指定if语句,以便如果系统上不存在目录,则不将其添加到PATH变量中。 - Warwick
你需要使用sudo编辑系统文件。在这些文件中,不能使用仅限于Bash的语法,因为它们与非Bash shell共享。你可能只需移除export,因为你现有的配置很可能已经负责导出此变量。如果没有,请在单独的一行上添加export PATH - tripleee
此外,/etc/profile.d是特定于平台的;如果该目录不存在,请检查/etc/profile并查看是否有选项可以引用(也称为.)未由您的操作系统管理的文件,这样您就无需直接编辑此系统文件。 - tripleee

5

永久添加到PATH环境变量

全局:

echo "export PATH=$PATH:/new/path/variable" >> /etc/profile

本地(仅限当前用户):

echo "export PATH=$PATH:/new/path/variable" >> ~/.profile

对于全局,请重新启动。对于局部,请重新登录。

示例:

之前:

$ cat /etc/profile

#!/bin/sh

export PATH=/usr/bin:/usr/sbin:/bin:/sbin

之后:

$ cat /etc/profile

#!/bin/sh

export PATH=/usr/bin:/usr/sbin:/bin:/sbin
export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/new/path/variable

你可以直接编辑“profile”文件:
$ cat /etc/profile

#!/bin/sh

export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/new/path/variable

另一种方法(感谢gniourf_gniourf):
echo 'PATH=$PATH:/new/path/variable' >> /etc/profile

在这里不应该使用双引号!echo 'export PATH=$PATH:/new/path/variable'...顺便说一下,export关键字很可能是无用的,因为PATH变量很可能已经被标记为导出的。 - gniourf_gniourf


1
不行。你在这里不应该使用双引号!echo 'export PATH=$PATH:/new/path/variable'... 顺便说一下,export关键字很可能是无用的,因为PATH变量很可能已经被标记为导出。 - gniourf_gniourf
不对,你应该使用双引号,因为单引号中的$PATH不会被解析。顺便提一下,export命令也很有用。 - user3439968
我明白了。你可以使用双引号或单引号,因为当echo执行或/etc/profile执行时,$PATH会被插值。 - user3439968
1
@user3439968,如果您要从多个文件中附加到$PATH,则双引号会导致许多问题。请考虑:当您使用双引号时,$PATH将被翻译为一个静态字符串,其中包含所有先前定义的PATH目录。假设您使用~/.bashrc/usr/local附加到它。现在,如果您打算使用/etc/bash.bashrc/opt/bin附加到同一变量;$PATH将转换为相同的静态字符串,结果$PATH将被替换而不是附加...这将成为系统对一个文件优先于另一个文件的偏好问题。 - trve.fahad

4
将脚本文件[name_of_script].sh添加到/etc/profile.d文件夹中,方法是添加以下代码行:
export PATH=$PATH:/dir

每个位于/etc/profile.d文件夹中的脚本都会在登录时被/etc/profile自动执行。

这是如何自定义您的环境的推荐方式。 - Yuriy Vasylenko
2
这仅适用于您希望设置为系统范围的情况,这可能不是最常见的用例。大多数人希望(或应该希望)将路径设置为本地设置,因为大多数用户/角色正在执行上下文不同的操作,而您做出的假设越少,就越好。 - mpowered
@mpowered,是的,这只适用于系统范围。如果您想本地更改PATH,则应在〜/ .profile或〜/ .bashrc中添加相同的导出。在这里,您应该考虑登录shell读取〜/ .profile和交互式shell读取〜/ .bashrc。这非常重要,因为例如ssh不会登录,因此不会读取〜/ .profile。像suse这样的几个发行版在/ etc / profile中源化〜/ .bashrc。但这对所有Linux都不常见 - Yuriy Vasylenko
如果您正在引用可执行的脚本/应用程序,请不要忘记使用“source [name_of_script].sh”将这些应用程序立即提供给当前 shell。 - ObiHill

4

我的回答是关于在Ubuntu Linux(amd64)上设置Go环境。我也遇到了同样的问题,即设置环境变量路径(GOPATHGOBIN),但在终端退出后丢失,并需要每次使用source <file_name>重新构建。

错误在于将路径(GOPATHGOBIN)放在~/.bash_profile文件中。浪费了几个好小时后,我发现解决方案是以以下方式将GOPATHGOBIN放入~/.bash_rc文件中:

export GOPATH=$HOME/go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOPATH:$GOBIN

在这样做的过程中,Go安装工作正常,没有路径损失。

这个问题可以与非登录shell的设置相关,比如你的Ubuntu终端或者我们运行Go代码的GNOME终端,都会从~./bash_rc文件获取设置,而登录shell的设置则来自于~/.bash_profile文件。如果~/.bash_profile文件无法访问,则从~/.profile文件获取设置。


3

Zues77的想法很正确。OP并没有说“我该如何通过黑客方式解决这个问题?”。OP想知道如何永久地追加到$ PATH

sudo nano /etc/profile

这是设置所有内容的地方,也是更改所有需要$PATH的最佳地方。


"Zues77"是谁?它指的是什么答案或评论? - Peter Mortensen

3
假设你正在运行macOS系统。你有一个你信任的二进制文件,并希望在整个系统中使用它,但不一定想将包含该二进制文件的目录添加到你的PATH路径中。
你可以选择将该二进制文件复制/移动到/usr/local/bin目录下,该目录应已在你的PATH路径中。这将使该二进制文件像你可能已经访问到的其他二进制文件一样可执行。

3

您添加export命令的文件取决于您是否处于登录模式或非登录模式。

如果您处于登录模式,则要查找的文件为/etc/bash/etc/bash.bashrc之一。

如果您处于非登录模式,则要查找的文件为/.profile,或者在目录/.profiles.d中的文件。

上述文件是系统变量所在的位置。


.profile” 实际上在根目录下吗?你是指 ~/.profile 吗?.profiles.d 也是一样的情况。 - Peter Mortensen
在文件/etc/profile.d中? - Peter Mortensen
而且是 profile.d,不是 profiles.d 吗? - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接