【问题标题】:How to permanently set $PATH on Linux/Unix [closed]如何在 Linux/Unix 上永久设置 $PATH [关闭]
【发布时间】:2013-01-16 06:35:01
【问题描述】:

在 Linux 上,如何将目录添加到 $PATH 以使其在不同会话中保持不变?

背景

我正在尝试将一个目录添加到我的路径中,以便它始终位于我的 Linux 路径中。我试过了:

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

这可行,但是每次我退出终端并启动一个新的终端实例时,这条路径都会丢失,我需要再次运行导出命令。

我该怎么做才能永久设置?

【问题讨论】:

  • 如果你在mac上,那么bashrc可以正常工作,不需要不断source ~/.profile让终端从环境变量中读取

标签: linux bash unix path zsh


【解决方案1】:

在 Ubuntu 中,编辑 /etc/environment。它的唯一目的是存储 environment variables。原来 $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 文件中的 cmets 之后:

source /etc/environment

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

【讨论】:

  • 并非所有系统都有 /etc/environment
  • FWIW $PATH 也在 Arch Linux 的 /etc/profile 中定义。
  • @e-sushi 我对此感到震惊。我自己在 ubuntu 14.04.1 上。我可以向你保证文件是内置的。
  • 在尝试了除了 /etc/environment 之外的所有建议之后,并且让它们都不起作用,我终于偶然发现了这一点。我也在 Ubuntu 14.04 上,这是唯一一个在重启后实际更改了 PATH 变量的版本。
  • 更新环境文件后需要重启电脑。
【解决方案2】:

这是一个单行。它在.bashrc 中添加了一行。该行将检查目录是否已添加到路径中,如果没有则追加。这将防止您每次获取 .bashrc 时在路径中复制您的目录。

echo "[[ \":\$PATH:\" != *\":$(pwd)/path/to/add:\"* ]] && export PATH=\"\${PATH:+\${PATH}}:$(pwd)/path/to/add\"" >> ~/.bashrc

source ~/.bashrc

【讨论】:

  • 如果你单引号引起来,你不必反斜杠转义所有嵌入的双引号。
【解决方案3】:

经过这么多研究,我找到了一个简单的解决方案(我使用的是Elementary OS),灵感来自Flutter – Step by Step Installation on Linux – Ubuntu

运行以下命令以编辑模式打开.bashrc文件。 (你 也可以使用 vi 或任何其他编辑器)。

~$ sudo nano ~/.bashrc

在文件末尾添加以下行并保存。

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

例如:

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

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

【讨论】:

    【解决方案4】:

    假设您正在运行macOS。您有一个您信任的二进制文件并希望在整个系统中可用,但不一定希望将二进制文件所在的目录添加到您的 PATH 中。

    您可以选择将二进制文件复制/移动到 /usr/local/bin,它应该已经在您的 PATH 中。这将使二进制可执行文件与您可能已经在终端中访问的任何其他二进制文件一样。

    【讨论】:

      【解决方案5】:
      1. 修改“/etc/profile”文件:

        vi /etc/profile
        

        I键进入编辑模式,将光标移动到文件末尾。附加条目:

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

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

      2. 使配置生效

        source /etc/profile
        

        解释:

        profile 文件适用于所有用户。如果您希望它仅对活动用户有效,请更改“.bashrc”文件。

      【讨论】:

        【解决方案6】:

        对于Debian 分发,您必须:

        • 编辑文件~/.bashrc。例如:vim ~/.bashrc
        • 添加export PATH=$PATH:/path/to/dir
        • 然后重新启动您的计算机。请注意,如果您以 root 身份编辑文件 ~/.bashrc,您添加的环境变量将仅适用于 root

        【讨论】:

        • 如果你在mac上,那么bashrc可以正常工作,不需要不断source ~/.profile让终端从环境变量中读取
        • 是的,似乎确实需要重新启动。但原因是什么?没有别的办法吗?
        【解决方案7】:

        我认为最优雅的方式是:

        1. 将此添加到 ~/.bashrc 文件中。

          运行这个命令:

           gedit ~/.bashrc
          

          在里面添加你的路径:

           export PATH=$PATH:/opt/node/bin
          
        2. source ~/.bashrc

        (Ubuntu)

        【讨论】:

        【解决方案8】:

        我的回答是关于在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 文件中获取。

        【讨论】:

          【解决方案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 并将我的脚本放在那里。

          【讨论】:

          • 也在Ubuntu MATE 20.04 (Focal Fossa)。所有基于Debian 的发行版的标准?甚至比这更宽?
          • 哎呀,忽略了这个问题:(好吧,bash 考虑其内容的文件+,这几乎是 bash 内置的。所以,如果上面的 sn-p 不适合你,但是, 你可以很容易地添加它。这看起来很好作为参考baeldung.com/linux/bashrc-vs-bash-profile-vs-profile 是的,它在 Focal 上为我提供(虽然是 gnome):)
          【解决方案10】:

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

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

          这会将当前目录(或者您可以使用其他目录)添加到 PATH。这使它成为永久的,但在下次用户登录时生效。

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

          source ~/.bash_profile
          

          这会重新加载# User specific environment and startup programs。此评论存在于文件 .bash_profile 中。

          【讨论】:

            【解决方案11】:

            我认为最优雅的方式是:

            1. ~./bashrc 文件中添加这个:

              if [ -d "new-path" ]; then
                PATH=$PATH:new-path
              fi
              
            2. source *~/.bashrc*

            (Ubuntu)

            【讨论】:

            • 并在上面显示路径: printf "%s\n" $PATH
            【解决方案12】:

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

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

            ~/.bash_profile(当前用户)

            ~/.bash_login(当前用户)

            ~/.profile(当前用户)

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

            摘自:Linux: Añadir ruta al PATH

            【讨论】:

            • 那是什么?西班牙语?葡萄牙语?
            【解决方案13】:

            一种对我有用的添加永久路径的方法是:

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

            重新启动您的计算机,我们开始;路径将永久存在。

            【讨论】:

            • 您实际上不需要重新启动计算机。注销并重新登录就足够了。这是一个非常优雅的解决方案,因为无需编辑文件即可轻松撤销任何更改。指定 if 语句也很容易,这样如果系统上不存在目录,则不会将其添加到 PATH 变量中。
            • 您需要使用sudo来编辑系统文件。您不能在这些文件中使用仅限 Bash 的语法,这些文件与非 Bash shell 共享。您可能只需删除export,因为您现有的配置可能已经处理了exporting 这个变量。如果没有,请在单独的行中添加 export PATH
            • 另外,/etc/profile.d 是特定于平台的;如果此目录不存在,请检查 /etc/profile 并查看它是否具有获取不受操作系统管理的文件的选项(又名 .),因此您不必直接编辑此系统文件。
            【解决方案14】:

            Zues77 的想法是正确的。 OP没有说“我怎么能破解这个?”。 OP 想知道如何永久附加到 $PATH

            sudo nano /etc/profile
            

            这是为所有东西设置的地方,也是为所有需要$PATH的东西更改它的最佳位置。

            【讨论】:

            • “Zues77”是谁?它指的是什么答案或评论?
            【解决方案15】:

            将脚本文件[name_of_script].sh 添加到/etc/profile.d 文件夹中,添加以下行:

            export PATH=$PATH:/dir
            

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

            【讨论】:

            • 推荐的自定义环境方式
            • 这仅适用于您希望设置在系统范围内,这可能不是最常见的用例。大多数人希望(或应该希望)在本地设置路径,因为大多数用户/角色正在执行上下文不同的操作,并且您做出的假设越少越好。
            • @mpowered,是的,这仅适用于系统范围。如果您想在本地更改 PATH,您应该在 ~/.profile 或 ~/.bashrc 中添加相同的导出。在这里,您应该考虑登录 shell 读取 ~/.profile 而交互式 shell 读取 ~/.bashrc。这非常重要,因为例如 ssh 不会登录,因此不会读取 ~/.profile。 /etc/profile 中的几个分布,如 suse source ~/.bashrc。但并不是所有 linux 都通用'
            • 如果您正在引用可执行脚本/应用程序,请不要忘记source [name_of_script].sh 以使这些应用程序在当前 shell 中立即可用
            【解决方案16】:

            永久添加到 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
            

            您也可以只编辑文件“配置文件”:

            $ 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 '导出 PATH=$PATH:/new/path/variable'... 顺便说一下 export 关键字 很可能没用,因为 PATH 变量很可能已经 标记为已导出。 – gniourf_gniourf

            【讨论】:

            • 不。你不应该在这里使用双引号! echo 'export PATH=$PATH:/new/path/variable'... 顺便说一句,export 关键字很可能没有用,因为 PATH 变量很可能已经标记为已导出。
            • 不,您应该使用双引号,因为单引号中的 $PATH 未插入。顺便说一句,导出也很有用。
            • 我明白了。您可以使用双引号或使用单引号,因为 $PATH 在执行 echo 时插入或在 /etc/profile 执行时插入。
            • @user3439968 实际上,如果您要从多个文件附加到 $PATH ,双引号会导致很多问题。考虑:当您使用双引号时,$PATH 会被转换为包含所有先前定义的 PATH 目录的静态字符串。假设您使用~/.bashrc/usr/local 附加到它上面。现在,如果您打算使用/etc/bash.bashrc/opt/bin 附加到同一个变量; $PATH 将转换为相同的静态字符串,因此 $PATH 将被替换而不是附加到...这将是系统偏好一个文件而不是另一个文件的问题
            【解决方案17】:

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

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

              您可能需要在用户主目录中的文件.bash_profile 中创建条目。

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

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

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

            【讨论】:

            • 您的发行版上是否有名为/etc/profiles 的文件带有s?我的没有s。我认为你有一个错字。
            • 您可能想要转义 $ 您正在写入配置文件的文件。例如echo "export PATH=\$PATH:/path/to/dir" >> /etc/profile,这样你在脚本运行时实际附加到变量,而不是根据当时的值将其设置为文字值执行这个初始命令。
            【解决方案18】:

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

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

            如果您处于非登录模式,您正在寻找文件 /.profile 或目录 /.profiles.d 中的文件p>

            上面提到的文件是系统变量所在的地方。

            【讨论】:

            • .profile 实际上在根目录中吗?你的意思是~/.profile.profiles.d 也是如此。
            • 在文件/etc/profile.d?
            • 还有profile.d,而不是profiles.d
            【解决方案19】:

            最简单的方法是下面一行,

            PATH="<directory you want to include>:$PATH"
            

            在您的主目录中的.bashrc file 中。

            即使您关闭终端或重新启动 PC,它也不会被重置。它是永久性的。

            【讨论】:

            • @quant 如果您按照所说的去做,它将永久设置您的设置。即使你关闭终端它也能工作。
            【解决方案20】:

            您可以将该行添加到您的控制台配置文件(例如,.bashrc.profile)。

            【讨论】:

            • 我在/home/(username)中没有这些文件
            • @ClickUpvote:你使用什么外壳? (并且以点开头的文件是隐藏的,您需要ls -a 之类的东西才能看到它们。)
            • 如果您没有任何这些文件(bashrc 或配置文件),您可以手动创建它们,它们将被自动使用
            【解决方案21】:

            有多种方法可以做到这一点。实际的解决方案取决于目的。

            变量值通常存储在分配列表或在系统或用户会话开始时运行的 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 System 的用户运行的。对于像/usr/local/something/bin 这样对每个用户都有效的PATH 条目,这是一个不错的选择。该文件包含在其他脚本中,因此请使用 POSIX shell 语法而不是您的用户 shell 的语法。

            4. /etc/profile/etc/profile.d/* Shell 脚本。对于纯 shell 系统,这是一个不错的选择。这些文件只能由登录模式下的 shell 读取。

            5. /etc/&lt;shell&gt;.&lt;shell&gt;rc。外壳脚本。这是一个糟糕的选择,因为它是特定于单个 shell 的。在非登录模式下使用。

            用户会话

            1. ~/.pam_environment。唯一分配列表,不允许引用。由 PAM 在每个用户会话开始时加载,与 X Window 系统会话或 shell 无关。您不能引用其他变量,包括 HOMEPATH,因此它的用途有限。由 PAM 使用。

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

            3. ~/.profile~/.&lt;shell&gt;_profile~/.&lt;shell&gt;_login Shell 脚本。它仅对从终端或终端仿真器启动的程序可见。对于纯 shell 系统来说,这是一个不错的选择。由 shell 在登录模式下使用。

            4. ~/.&lt;shell&gt;rc。外壳脚本。这是一个糟糕的选择,因为它是特定于单个 shell 的。由非登录模式下的 shell 使用。

            备注

            GNOME on Wayland 启动用户登录 shell 以获取环境。它有效地使用了登录 shell 配置 ~/.profile~/.&lt;shell&gt;_profile~/.&lt;shell&gt;_login 文件。

            Man pages

            特定于发行版的文档

            Difference between Login Shell and Non-Login Shell?

            【讨论】:

            • 谢谢你的详细回答,这应该更高。也许.bash_profile 也应该添加到列表中?
            • @JamesKo 那是第 4 位
            • 我认为最好的答案是建议/etc/environment。但是我可以在不注销和登录的情况下刷新它吗?有时我不使用 bash 或 sh 所以source /etc/environment 不起作用。
            • 很好,在我看来是最完整的答案。应该更高。
            • 我搜索这个主题的原因实际上是Go。很高兴看到我不是唯一一个意识到 .bashrc 不是正确位置的人。 ;)
            【解决方案22】:

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

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

            【讨论】:

            • 需要重启吗?
            • 当我把它放在.profile'时工作,没有找到.bashrc
            • 可能取决于具体的系统;我不确定究竟是什么条件决定了执行哪个文件。不过,很高兴问题得到了解决。
            • @Click Upvote 您需要执行source ~/.bashrc 以重新加载.bashrc 配置。然后它会工作
            • 只有在PATH 尚未被标记为环境变量时才需要export 关键字——它几乎无条件地标记为环境变量。只需PATH=/var/lib/gems/1.8/bin:/home/fraxtil/.bin:$PATH 就会有同样的效果。
            【解决方案23】:

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

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

            【讨论】:

            • 这个问题被标记为bash,所以这不是很有帮助。
            • 这是一个有效的答案 -> 标题只提到了 Linux,所以 bash 和 zsh 也可以……如果标签只是“bash”,我们也需要在标签中添加“zsh”
            【解决方案24】:

            您需要将其添加到您的 ~/.profile~/.bashrc 文件中。 

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

            根据您的操作,您可能还需要符号链接到二进制文件:

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

            请注意,这不会在会话的剩余部分自动更新您的路径。为此,您应该运行:

            source ~/.profile 
            or
            source ~/.bashrc
            

            【讨论】:

            • 几个问题。 1)$PATH/usr/bin之间不应该有冒号。 2) /usr/bin 是否应该在那里。 3) 你不应该使用/usr/local/bin吗?
            • 请注意:在 bash PATH 末尾留下一个尾随冒号通常被认为是一个安全漏洞,因为它使 bash 在当前目录中查找找不到它正在寻找的可执行文件。应告知发现此帖子以寻找更多信息的用户。
            • @AdamRobertson 这是不安全的 - 考虑解压缩 tarball 的场景,然后将 cd 到解压缩它的目录,然后运行 ​​ls---然后意识到 tarball 有里面有一个名为ls的恶意程序。
            • 对我来说是 .bash_profile,而不是 .profile。看来这对每个人来说都不一样。
            • 我认为我显着提高了这个答案的质量,并解决了其他用户提出的一些问题。每个路径导出或调整路径的每个命令都应始终确保用冒号分隔现有路径。切勿使用前导或尾随冒号,并且当前目录不应位于路径中。
            猜你喜欢
            • 2021-08-18
            • 2012-07-27
            • 1970-01-01
            • 1970-01-01
            • 2020-05-25
            相关资源
            最近更新 更多