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

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

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

如何使其永久设置?


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

1225
您需要将其添加到您的~/.profile~/.bashrc文件中。 
export PATH="$PATH:/path/to/dir"

根据你所做的事情,你可能还希望创建二进制文件的符号链接:

cd /usr/bin
sudo ln -s /path/to/binary binary-name

请注意,这不会自动更新您的路径,直到本次会话结束。 要实现此目的,您应该运行:

source ~/.profile 
or
source ~/.bashrc

12
几个问题。 1)$PATH/usr/bin之间不应该有一个冒号吗? 2)/usr/bin应该在那里吗? 3)你是否应该使用/usr/local/bin - Batandwa
230
请注意:在您的bash PATH末尾留下冒号常常被认为是一种安全漏洞,因为这样做会使得bash如果找不到它正在寻找的可执行文件时就会在当前目录中查找。查看此文章以获取更多信息的用户应该知道这一点。 - erewok
55
@AdamRobertson 这是不安全的-考虑一下这种情况,当您解压tarball时,然后cd到您解压它的目录中,然后运行ls---然后意识到tarball中有一个恶意程序叫做ls - Lily Chung
22
对我而言,需要修改的是 .bash_profile 文件,而不是 .profile 文件。似乎每个人的情况都不同。 - donquixote
10
我认为我显著提高了这个答案的质量,并解决了其他用户提出的一些问题。每次路径导出或调整路径的命令时,都应确保用冒号分隔现有路径。不应使用前导或尾随冒号,并且当前目录不应包含在路径中。 - Erick Robertson
显示剩余25条评论

390

有多种方法可以实现。实际的解决方案取决于目的。

变量值通常存储在分配列表或在系统或用户会话启动时运行的shell脚本中。如果使用shell脚本,则必须使用特定的shell语法和exportset命令。

系统范围内

  1. /etc/environment 独立的赋值列表,允许使用引用。非常适合将系统范围的目录(如 /usr/local/something/bin)添加到 PATH 变量或定义 JAVA_HOME。被 PAMsystemd 使用。

  2. /etc/environment.d/*.conf 独立的赋值列表,允许使用引用。非常适合将系统范围的目录(如 /usr/local/something/bin)添加到 PATH 变量或定义 JAVA_HOME。配置可以分成多个文件,通常每个工具一个文件(Java、Go 和 Node.js)。被 systemd 使用,它设计为不将这些值传递给用户登录 shell。

  3. /etc/xprofile X Window 系统会话启动时执行的 shell 脚本。对于登录 X Window 系统的每个用户都要运行它。这是适用于所有用户的 PATH 条目的不错选择,例如 /usr/local/something/bin。该文件由其他脚本包含,因此请使用 POSIX shell 语法而不是用户 shell 的语法。

  4. /etc/profile/etc/profile.d/* shell 脚本。适用于仅包含 shell 的系统。这些文件只在登录模式下被 shell 读取。

  5. /etc/<shell>.<shell>rc shell 脚本。这是一个糟糕的选择,因为它只适用于单个 shell。在非登录模式下使用。

User session

  1. ~/.pam_environment。唯一赋值的列表,不允许引用其他变量,包括HOMEPATH等,因此使用受限。在每个用户会话开始时由PAM加载,无论它是X Window System会话还是shell。被PAM使用。

  2. ~/.xprofile。Shell脚本。当用户登录到X Window System系统时执行。在此定义的变量对每个X应用程序都可见。用于扩展路径值,例如~/bin~/go/bin或定义特定于用户的GOPATHNPM_HOME非常合适。该文件由其他脚本包含,因此请使用POSIX shell语法而不是您的用户shell语法。您通过快捷方式启动的图形文本编辑器或IDE将看到这些值。

  3. ~/.profile~/.<shell>_profile~/.<shell>_login。Shell脚本。仅对从终端或终端模拟器启动的程序可见。对于仅使用shell的系统来说是一个很好的选择。由登录模式的shell使用。

  4. ~/.<shell>rc。Shell脚本。这是一个不好的选择,因为它是单个shell特定的。由非登录模式的shell使用。

注释

GNOMEWayland 上启动用户登录 shell 以获取环境。它有效地使用登录 shell 配置文件 ~/.profile~/.<shell>_profile~/.<shell>_login

手册页

特定于发行版的文档

登录 Shell 和非登录 Shell 之间有什么区别?


8
感谢您提供详细的回答,这应该更加突出。也许还应该将.bash_profile添加到列表中吗? - James Ko
4
@JamesKo,那是第四个。 - trve.fahad
1
我认为最好的答案是建议使用/etc/environment。但是我能否在不注销登录的情况下刷新它?有时我不使用bash或sh,因此source /etc/environment无法工作。 - banan3'14
2
非常好的回答,我认为这是最完整的答案。应该排得更高。 - Peter Gloor
2
我搜索这个主题的原因实际上是因为Go。很高兴看到我不是唯一一个意识到.bashrc不是正确的位置的人。;) - Peter Gloor
显示剩余6条评论

263
在Ubuntu中,编辑/etc/environment文件。它的唯一目的是存储环境变量。最初在这里定义了$PATH变量。
这是我/etc/environment文件的剪贴板:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

所以您可以直接以root用户身份打开此文件并添加任何内容。

如需立即结果,

请运行以下命令(尝试使用普通用户和root用户):

source /etc/environment && export PATH

如果您使用的是Z shell(zsh),请在/etc/zsh/zshenv文件的注释后面添加此行:

source /etc/environment

我在Ubuntu 15.10(Wily Werewolf)上遇到了这个小问题,但如果你的 zsh 没有得到正确的 PATH ,可能就是这个原因。


18
不是所有的系统都有 /etc/environment 文件。 - user3439968
12
值得一提的是,在 Arch Linux 中,$PATH 也被定义在 /etc/profile 文件中。 - Sparhawk
3
@e-sushi,我真的很震惊。我自己使用的是Ubuntu 14.04.1,我可以向你保证这个文件是内置的。 - trve.fahad
3
在尝试了所有可能的建议,包括/etc/environment文件,但它们都没有生效之后,我最终偶然发现了这个方法。我也在使用Ubuntu 14.04系统,在重启后,只有这个方法真正改变了PATH变量。 - Chockomonkey
4
更新环境文件后,用户应该重新启动电脑。 - Harish_N
显示剩余8条评论

87

对于Bash,您可以将export声明放在~/.bashrc中。例如,我的.bashrc文件包含以下行:

export PATH=/var/lib/gems/1.8/bin:/home/ash/.bin:$PATH

10
需要重新启动? - Ali
2
当我将这段代码放入 .profile 文件时,程序可以工作,但是在 .bashrc 文件中却没有找到它。 - Ali
可能取决于具体的系统;我不确定确定哪个文件被执行的条件是什么。不过很高兴问题已经解决了。 - ashastral
14
要使 .bashrc 配置生效,您需要执行 source ~/.bashrc 命令重新加载配置。然后它就会起作用了。 - BigSack
6
只有当PATH没有被标记为环境变量时,才需要使用export关键字--但几乎肯定已经被标记为环境变量了。简单地PATH=/var/lib/gems/1.8/bin:/home/fraxtil/.bin:$PATH即可达到相同的效果。 - Charles Duffy
显示剩余5条评论

36

您可以通过以下两种方式永久设置$PATH

  1. 为特定用户设置路径:

    您可能需要在用户的主目录下的文件.bash_profile中进行设置。

    例如,在我的情况下,我将在Tomcat用户配置文件中设置java路径*

 echo "export PATH=$PATH:/path/to/dir" >> /home/tomcat/.bash_profile
  • 为所有系统用户设置共同路径,您可能需要像这样设置路径:

  •  echo "export PATH=$PATH:/path/to/dir" >> /etc/profile
    

    3
    你的发行版中是否有一个名为 /etc/profiles 的文件名,有带有 s?我的没有 s。我认为你打错了。 - Chris Johnson
    4
    你可能希望在写入配置文件时转义美元符号。例如,将以下内容添加到/etc/profile文件中:echo "export PATH=$PATH:/path/to/dir" >> /etc/profile。这样,在运行脚本时,实际上是向变量追加而不是基于该命令执行时的字面值设置它。 - BuvinJ
    echo "export PATH=$PATH:/path/to/dir" >> /home/<USERNAME>/.bashrc 这个命令适用于WSL和Kali发行版。新的方法是你可以设置任何变量,例如 echo "export PYTHONPATH=/path/to/dir" >> /home/<USERNAME>/.bashrc 用于创建新的变量,而 echo "export PYTHONPATH=$PYTHONPATH:/path/to/dir" >> /home/<USERNAME>/.bashrc 用于更新已有变量。 - Akash Shendage

    18

    对于本地用户,您可以在CentOSRed Hat Linux (RHEL)上使用:

    echo $"export PATH=\$PATH:$(pwd)" >> ~/.bash_profile
    

    这将把当前目录(或您可以使用另一个目录)添加到PATH中。这样做是永久性的,但它会在下一次用户登录时生效。

    如果您不想重新登录,那么可以使用:

    source ~/.bash_profile
    

    重新加载#用户特定环境和启动程序。这个注释位于.bash_profile文件中。


    15

    您也可以永久设置它,编辑以下其中一个文件:

    /etc/profile(适用于所有用户)

    ~/.bash_profile(适用于当前用户)

    ~/.bash_login(适用于当前用户)

    ~/.profile(适用于当前用户)

    您还可以使用/etc/environment设置永久的PATH环境变量,但它不支持变量扩展

    摘自:Linux: Añadir ruta al PATH


    那是用什么语言?西班牙语?葡萄牙语? - Peter Mortensen

    12
    1. 修改“/etc/profile”文件:

    vi /etc/profile
    

    按下I键进入编辑模式并将光标移动到文件末尾。其他条目:

    export PATH=$PATH:/path/to/dir;
    

    按下Esc键退出编辑模式,按下:wq保存文件。

  • 使配置生效

  • source /etc/profile
    

    说明:

    配置文件适用于所有用户。如果您希望仅对活动用户有效,请更改".bashrc" 文件。


    11

    我认为最优雅的方法是:

    1. 将以下内容添加到~/.bashrc文件中。

      运行此命令:

     gedit ~/.bashrc
    
    请将您的路径添加到其中:
     export PATH=$PATH:/opt/node/bin
    
  • source ~/.bashrc

  • (Ubuntu)


    2
    当你抄袭Gimcuan Hui的回答时,你是否遗漏了重要的部分? - Peter Mortensen

    9

    我昨天在搜索添加包含自己脚本的文件夹到PATH的方法时偶然发现了这个问题,令我惊讶的是我的 ~/.profile 文件(在Linux Mint 18.1上)已经包含了以下内容:

    # set PATH so it includes user's private bin if it exists
    if [ -d "$HOME/bin" ] ; then
        PATH="$HOME/bin:$PATH"
    fi
    

    因此,我所需做的就是创建文件夹~/bin并将我的脚本放在那里。

    1
    同样适用于Ubuntu MATE 20.04 (Focal Fossa)。这是所有基于 Debian 的发行版的标准吗?或者更广泛地说呢? - Peter Mortensen
    哎呀,我忽略了问题 :( 好吧,文件+ bash 考虑它们的内容,这基本上是一个 bash 内置功能。因此,如果你还没有上面的片段,你可以很容易地添加它。这看起来很不错,作为一个参考 https://www.baeldung.com/linux/bashrc-vs-bash-profile-vs-profile 对于我来说(gnome),在 Focal 上是有的 :) - RobertG

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