如何将目录添加到路径中?

如何在Ubuntu中将目录添加到$PATH并使更改永久生效?

5这是一个非常有用的信息,它将帮助你找到修改环境变量的方法,并告诉你如何正确地进行操作,避免出现问题。在这里,你可以找到关于环境变量的所有必要知识。我发现很多输入都是错误的,或者至少不是推荐的方法。所以,如果你想根据自己的需求修改环境变量,这个链接会给你提供很大帮助,而且不会像我之前按照一些错误建议那样搞砸一切。祝一切顺利! - Bus42
17个回答

使用~/.profile设置$PATH

.bash_profile中设置的路径只会在bash登录shell(bash -l)中设置。 如果您将路径放入.profile中,它将对整个桌面会话可用。这意味着连metacity也会使用它。

例如:~/.profile

if [ -d "$HOME/bin" ] ; then
  PATH="$PATH:$HOME/bin"
fi

顺便说一下,你可以通过查看进程的环境变量在/proc/[pid]/environ中检查进程的PATH变量(将[pid]替换为ps axf中的数字)。例如,使用grep -z "^PATH" /proc/[pid]/environ

注意:

bash作为登录shell时如果存在.bash_profile.bash_login,它不会解析.profile。根据man bash

它按照以下顺序查找~/.bash_profile、~/.bash_login和~/.profile,并从第一个存在且可读的文件中读取并执行命令。

有关.pam_environment的信息,请参见下面的答案,或者对于交互式非登录shell,请参见.bashrc,或者通过将脚本放入/etc/profile.d/全局设置该值适用于所有用户,或使用/etc/X11/Xsession.d/影响显示管理器会话。


5太棒了,成功了。我看到它会自动添加bin目录,所以我就直接用那个了,而不是用脚本。谢谢。 - justingrif
8在Xbunutu上,.profile文件不会被执行,所以我把它放在了.bashrc文件中,这样就可以正常工作了。 - tekumara
16这份文档做得非常好:关于环境变量的官方文档。建议阅读一下(并不是说它已经更新到最新版本的规则以添加环境变量值)。 - Michele
如果你想在PATH语句中使用空格,像这样:PATH = "...那你会有一番惊喜:Bash将无法解析它,并且只会回应PATH不是一个命令。 - Chris Moschini
@LiveWireBT:你能进AU general chat并讨论一下你在3月7日编辑中获取信息的来源吗? - Fabby
3.profile 文件的哪个位置添加路径? - Vineet Kaushik
这个是用来干什么的?我不能只使用内部部分吗? - MakisH
4我还不知道在哪里添加我的额外路径部分。我需要将Android SDK添加到我的路径中... PATH="$HOME/bin:$PATH" 那么我应该将它添加进去吗? - Jamie Hutber
4请注意,.profile 文件仅在登录时使用,因此您必须注销并重新登录才能使用它(关闭和重新打开终端不足)。@JamieHutber 路径为 $WHERE_YOU_INSTALLED_THE_SDK/platform-tools$WHERE_YOU_INSTALLED_THE_SDK/tools - Daniele Segato
~/.profile 在 Ubuntu 18.04 仍然有效。 - IamDOM
当有人以你的身份使用sudo时,.profile文件不会被使用。 - Syncopated
在 Elementary OS(基于 Ubuntu 18.04)上,.profile 文件没有被执行。因此,我不得不将这个放在 .bashrc 文件中。 - Qumber
2抱歉对于不具建设性的评论,但是...有人能解释一下为什么他们要把它搞得这么复杂吗? - Display Name
@Display Name 我能理解那种感受。我知道系统范围的PATH条目与特定用户帐户可用的条目是不同的,例如像profile、bashrc等/etc文件。能够在终端会话期间添加新的PATH条目是很好的:否则为后来被丢弃的软件包添加的条目会堵塞它。但是每次使用软件包都需要设置一个新条目也很麻烦。因此需要永久添加到PATH的条目。要了解更详细的解释,请阅读https://www.baeldung.com/linux/bashrc-vs-bash-profile-vs-profile 这并没有提及其他shell! - Trunk

在您的主目录下编辑.bashrc文件,并添加以下行:
export PATH="/path/to/dir:$PATH"

你需要在更改生效之前,获取你的 .bashrc 或者注销/登录(或重新启动终端)。要获取你的 .bashrc,只需输入以下命令:
$ source ~/.bashrc

4你是如何“获取你的.bashrc”的?你是如何“重新启动终端”的? - isomorphismes
6在bash中,只需要输入'. .bashrc'即可。 - Ophidian
1我假设你在你的主目录下,因为那是你想要编辑的.bashrc文件所在的位置。 - Ophidian
32.bashrc 不是设置环境变量的正确位置。它们应该放在 .profile 或者 .pam_environment 中。请参考 http://mywiki.wooledge.org/DotFiles。 - geirha
4@LaoTzu 不是 .bashrc 而是 .bashrc :) 或者说 source .bashrc - Markus Hedlund
真实的在这里 @Ophidian - Robin Hood
如果在路径之前使用了$PATH,会发生什么情况呢?例如:export PATH="$PATH:/path/to/dir" - MagePsycho
无论是之前还是之后都可以,但如果将其添加到末尾,则对于任何具有命名冲突的可执行文件都没有影响。在由构成路径的目录列表中,您的可执行文件副本将被忽略,而优先选择较早在列表中找到的一个。 - Ophidian
别忘了在末尾加上":$PATH",否则你将不得不通过使用ctrl+alt+F2登录到tty,并使用/usr/bin/nano编辑它。我就遇到过这种情况! - Daniel V
尝试过这个,但是把终端的所有命令都搞乱了。无论是尝试cd、ls还是其他命令,都会显示不可用,并且说可以通过/bin/ls来调用它们,或者将其添加到PATH中。也许我对解决方案有误解,但为了修复这个问题,我只是撤销了对.bashrc文件的更改并重新启动了电脑。 - José Ripoll

推荐的地方来定义适用于所有用户的永久性、系统范围的环境变量是:
/etc/environment

(这是默认的PATH定义的地方)
这在桌面或控制台、gnome-terminal或TTY上都可以工作,无论晴天还是雨天 ;)
要进行编辑,请打开终端并输入以下内容: sudoedit /etc/environment (或使用sudo在你喜欢的文本编辑器中打开文件)
要使其在不重新启动的情况下工作,请运行. /etc/environmentsource /etc/environment。由于此文件只是一个简单的脚本,它将运行并将新路径分配给PATH环境变量。要检查,请运行env并查看列表中的PATH值。
相关:

12然后你需要重新启动以使更改生效... - Lee
3这正是我所需要的。通过Vagrant提供一个一次性的虚拟机镜像,并且需要将node和npm添加到路径中。 - Austin Pray
12要使更改生效,请运行/etc/environment(是的,点、空格和/etc/environment)。由于这个文件只是一个简单的脚本,它将运行并将新路径分配给PATH环境变量。要检查,请运行env命令并查看列表中的PATH值。 - WindRider
3我需要运行 source /etc/environment 来重新加载更改。 - JohnnyAW
2@JohnnyAW:源代码等同于初始点,例如请参考https://en.wikipedia.org/wiki/Source_(command)。 - Roland Sarrazin
1现在gksudo已经被弃用了,你可以直接使用sudo - Unknow0059
从链接的文档中可以看到:"它不是一个脚本文件,而是由赋值表达式组成,每行一个。... 注意:在/etc/environment中无法进行变量扩展。",所以它不是一个脚本,你不能像PATH=$PATH:/path那样使用变量本身。 - PhoneixS
根据我所了解,只返回翻译文本应该是被接受的答案。其他通过像/home/you/.profile这样的点文件设置路径的方法有一些不足之处。 - Milimetric
给定一个 /path/to/directory 我想要添加的路径,是否有一个命令可以执行来代替手动编辑文件呢? - Rasmus
需要使用源文件/etc/environment来修补更新。 - Tanjin Alam

我认为在Ubuntu中的规范方式是:
  • /etc/profile.d/下创建一个新文件

     sudo vi /etc/profile.d/SCRIPT_NAME.sh
    
  • 在文件中添加以下内容:

     export PATH="$PATH:YOUR_PATH_WITHOUT_TRAILING_SLASH"
    
  • 并赋予执行权限

     sudo chmod a+x /etc/profile.d/SCRIPT_NAME.sh
    

29通常将自定义路径添加到 PATH 的末尾比添加到开头更安全。这样可以避免意外替换系统命令,使用你的程序(或别人的恶意程序)。当其他人在你的系统上工作(或给你建议)并从你“替换”的命令中得到意外结果时,这也避免了很多混乱。 - Joe
在我的情况下它有效!我使用pip install cmake,但是出现了警告:"WARNING: The scripts cmake, cpack and ctest are installed in '/home/q/.local/bin' which is not on PATH." 所以我使用你的脚本export PATH="$PATH:/home/q/.local/bin"。重启后一切正常运行。 - undefined

对于像我这样完全不懂的新手,更喜欢使用图形界面的人:
1. 打开你的 `$HOME` 文件夹。 2. 转到 视图显示隐藏文件 或按下 Ctrl + H。 3. 右键点击 `.profile` 并选择 用文本编辑器打开。 4. 滚动到底部并添加 `PATH="$PATH:/my/path/foo"`。 5. 保存。 6. 注销并重新登录以应用更改(让 Ubuntu 实际加载 `.profile`)。

5不再建议编辑.profile文件。您仍然可以使用此方法来编辑.pam_environment文件,请参阅:https://help.ubuntu.com/community/EnvironmentVariables - PulsarBlow
感谢 @PulsarBlow!虽然我不太确定具体的区别和好处是什么... 这是相关部分的直接链接:https://help.ubuntu.com/community/EnvironmentVariables#Session-wide_environment_variables - dain
3这个答案导致我的系统无法登录,因为所有路径都被覆盖。使用的是Ubuntu 16.04。 - Frisbetarian-Support Palestine
4@Frisbetarian 你必须确保添加$PATH:部分,其中包括现有的 PATH 定义。 - dain
@dain:你的评论救了我的命! - Py-ser
2主文件夹指的不是名为"home"的文件夹,而是在终端中键入"cd ~"后进入的那个文件夹。 - Aseem

对于仅特定用户可用的持久环境变量,我强烈推荐使用Ubuntu官方文档。

https://help.ubuntu.com/community/EnvironmentVariables

参考上面的文档,我已经通过以下步骤设置了我的Android SDK路径工具:
1. 在主目录下创建了一个名为`~/.pam_environment`的文件。 2. 文件内容为`PATH DEFAULT=${PATH}:~/android-sdk-linux/tools`。 3. 可以通过使用冒号(:)分隔路径来添加其他自定义用户路径。 4. 这需要重新登录,也就是您需要注销并重新登录到桌面环境。

将该行添加到您的~/.bashrc文件中。

每次打开终端时都会被调用

编辑: 根据下面的评论,为了更普适的设置,适用于所有的shell(包括在Unity中按下Alt-F2时),将这个行添加到您的~/.profile文件中。不过最好不要同时这么做,因为如果您打开终端,路径将会被添加两次到您的PATH环境变量中。


2实际上,我认为你可以在$HOME/.profile中设置个人配置,或者在/etc/profile中设置全局配置。但如果只需要针对bash,我想两者都可以。 - Marty Fried
那只适用于登录shell。编辑:呃...我猜系统会在你登录计算机时进行源操作。我一直以为它就像是远程登录的东西。 - Ian B.
2如果你将其设置在~/.bashrc中,它只会在你打开的终端中生效。例如,如果你按下Alt+F2并尝试从该目录运行命令,它将找不到。如果你将其设置在~/.profile~/.pam_environment中,gnome会话(或者你使用的其他桌面环境)将继承它。在~/.bashrc中追加PATH也有一个缺点,即如果你从另一个交互式bash shell中打开/执行bash,则它将被多次追加。 - geirha
3我有一段时间没有真正研究过这个问题了,所以我进行了一次搜索,似乎至少有95种不同的设置路径的方法,其中大部分在这里讨论过。我从来没有弄清楚哪种方法是最好的。不过,我认为对于个人路径来说,~/.profile是正确的;那是Ubuntu添加~/bin目录的地方。而且我承认我在方法数量上有些夸张了——只是一点点而已。 - Marty Fried
2@MartyFried,是的,引用freenode上#bash频道中的机器人所说:“绝大多数互联网上的bash脚本、代码、教程和指南都是垃圾。斯特金是个乐观主义者。”当你在谷歌上搜索bash问题时,通常会先找到很多半成品的解决方案,然后才能找到一个好的解决方案。哦,在这种情况下,我也会选择~/.profile - geirha
3@geirha - 我同意互联网上大多数指南都可能是垃圾,尤其是关于Linux的任何东西,因为不同的发行版,甚至是同一个版本,做事情的方式都不一样。通常来说,最终取决于什么有效,但大多数人并没有意识到有效只是有效,并不一定是正确的,甚至不一定会一直有效。我试图找出哪种方法才是真正正确的,因为我讨厌重复做事情——但这并不总是容易的。 :) - Marty Fried

将其添加到.bashrc中会起作用,但我认为设置路径变量的更传统方法是在.bash_profile中添加以下行。
PATH=$PATH:/my/path/foo
export PATH

根据这个帖子,似乎Ubuntu的行为与RedHat和克隆版本有些不同。

1我没有.bash_profile文件,我应该创建它吗? - justingrif
7如果你有.bashrc文件,就把它放在.bashrc里面。在Ubuntu中,图形界面终端不是登录shell,所以.bash_profile不会被执行。 - koenigdmj
1我没有运行图形界面的shell。但从上面的讨论中看来,.bashrc 应该能正常工作。 - justingrif
2如果你的shell是登录shell,两种方法都可以使用。但是我刚刚在我的一个Ubuntu机器上尝试了.bash_profile的方法,即使重新启动gnome会话后,它也没有加载我的.bash_profile。所以我认为在Ubuntu中将这个放在.bashrc文件中可能是更好的选择。 - 3dinfluence
3@justingrif 不需要.bash_profile。如果在交互登录时bash找不到.bash_profile,它会寻找.profile并使用该文件代替。在Ubuntu中,默认情况下你会有一个.profile.bashrc。如果我们忽略pam_env的话,.profile是设置环境变量的正确位置。 - geirha

要在整个系统中设置它,将行export PATH=/path/you're/adding:$PATH添加到/etc/profile的末尾。
要仅为当前登录的用户添加目录,请将相同的行添加到~/.bash_profile的末尾。

在终端中,使用cd命令切换到要添加到路径的目录
echo "export PATH=$(pwd):\${PATH}" >> ~/.bashrc

这不是我的主意。我在这个博客链接上找到了这条导出路径。