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

Cli*_*ote 818 unix linux bash zsh path

我正在尝试将路径添加到我的路径中,因此它始终位于我的Linux路径中.我试过了:

export PATH=$PATH:/path/to/dir
Run Code Online (Sandbox Code Playgroud)

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

我怎么能这样做才能永久设置?

mpo*_*red 1019

你需要将它添加到您的~/.profile~/.bashrc文件. 

export PATH="$PATH:/path/to/dir"
Run Code Online (Sandbox Code Playgroud)

根据你正在做的事情,你也可能想要符号链接到二进制文件:

cd /usr/bin
sudo ln -s /path/to/binary binary-name
Run Code Online (Sandbox Code Playgroud)

请注意,这不会自动更新会话剩余时间的路径.为此,您应该运行:

source ~/.profile 
or
source ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

  • *请注意*:它通常被认为是一个安全漏洞,在bash PATH的末尾留下一个尾部冒号,因为它使bash在当前目录中查找,如果它找不到它正在寻找的可执行文件.发现此帖子寻找更多信息的用户应该被告知这一点. (193认同)
  • @AdamRobertson这是不安全的 - 考虑你解压缩tarball的情况,然后`cd`到你解压缩它的目录,然后运行`ls` ---然后意识到tarball有一个名为`ls`的恶意程序它. (48认同)
  • 对我来说,它是.bash_profile,而不是.profile.似乎每个人都有所不同. (20认同)
  • 几个问题.1)`$ PATH`和`/ usr/bin`之间不应该有冒号.2)`/ usr/bin`应该在那里.3)你不应该使用`/ usr/local/bin`吗? (10认同)
  • 我认为我大大提高了这个答案的质量,并解决了其他用户提出的一些问题.每个路径导出或每个调整路径的命令都应始终确保使用冒号分隔现有路径.永远不应该使用前导冒号或尾随冒号,并且当前目录永远不应该在路径中. (9认同)
  • 只是为了澄清.现在显示的路径设置是正常的,包括当前目录并没有危险...我花了一些时间从这里的其他评论中找出来,但你可以从编辑历史中看到坏版本的样子 (4认同)
  • @Istvan Chung在这种情况下,系统的ls优先,但我看到你在说什么...... (3认同)
  • 很抱歉这是坏死的,但这对我来说不适用于Arch.相反,我将该行添加到`.bashrc`中. (3认同)

trv*_*7ad 240

在Ubuntu中,编辑/etc/environment.其唯一目的是存储环境变量.最初$ PATH变量在这里定义.这是我/etc/environment文件中的粘贴:

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
Run Code Online (Sandbox Code Playgroud)

因此,您只需以root身份打开此文件并添加所需内容即可.

对于立即结果,运行(尝试普通用户 root):

source /etc/environment && export PATH
Run Code Online (Sandbox Code Playgroud)

更新:

如果您使用zsh(又名Z Shell),请在评论后面添加此行/etc/zsh/zshenv:

source /etc/environment
Run Code Online (Sandbox Code Playgroud)

我在Ubuntu 15.10上遇到了这个小怪癖,但是如果你的zsh没有得到正确的PATH,这可能就是为什么

  • 并非所有系统都有/ etc/environment (12认同)
  • FWIW` $ PATH`也在Arch Linux的`/ etc/profile`中定义. (9认同)
  • 用户应在更新环境文件后重新启动PC. (4认同)
  • @ e-sushi我真的很震惊.我自己在ubuntu 14.04.1上.我可以向你保证文件内置了. (3认同)
  • 在尝试了阳光下的每个建议但是/ etc/environment,并且让它们都无法工作之后,我终于偶然发现了这一点.我也在Ubuntu 14.04上,这是唯一一个在重启后实际更改PATH变量的人. (2认同)
  • `/ etc/environment`适用于系统范围的环境变量.这是改变它的唯一原因.如果你在编辑这个文件时犯了一个错误,你可能会得到一个空的PATH变量(我不希望任何人).添加影响系统整体的PATH变量路径的好方法是使用`/ etc/profile.d`目录(此链接应该是一个有用的[link](https://help.ubuntu.com/社区/ EnvironmentVariables)). (2认同)

Grz*_*Żur 162

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

变量值通常存储在分配列表或在系统或用户会话开始时运行的shell脚本中.如果是shell脚本,则必须使用特定的shell语法.

系统范围

  1. export唯一任务列表.适合加入的全系统的目录像set/etc/environment变量或定义/usr/local/something/bin.
  2. PATH启动X Window System会话时执行Shell脚本.这是针对登录X Window System的每个用户运行的.对于JAVA_HOME对每个用户都有效的条目,它是一个不错的选择/etc/environment.d/*.conf.该文件包含在其他脚本中,因此使用POSIX shell语法而不是用户shell的语法.
  3. /usr/local/something/binPATHShell脚本.对于仅限shell的系统,这是一个不错的选择.这些文件只能由shell读取.
  4. JAVA_HOME.Shell脚本.这是一个糟糕的选择,因为它是单壳特定的.

用户会话

  1. /etc/xprofile.唯一任务列表.如果它是X Window System会话或shell,则在每个用户会话开始时由PAM加载无关.你不能引用其他变量,包括PATH/usr/local/something/bin因此它限制使用.
  2. /etc/profileShell脚本.当用户登录X Window System系统时执行此操作.这里定义的变量对每个X应用程序都是可见的.用于扩展完美的选择/etc/profile.d/*与值,例如/etc/<shell>.<shell>rc~/.pam_environment或定义用户特定HOMEPATH.该文件包含在其他脚本中,因此使用POSIX shell语法而不是用户shell的语法.您通过快捷方式启动的图形文本编辑器或IDE将查看这些值.
  3. ~/.xprofileShell脚本.它仅对从终端或终端仿真器启动的程序可见.对于仅限shell的系统,它是一个不错的选择.
  4. PATH.Shell脚本.这是一个糟糕的选择,因为它是单壳特定的.

分发特定文档

  • 谢谢你的详细解答,这应该更高了.也许`.bash_profile`也应该添加到列表中? (4认同)
  • @JamesKo 那是第 4 名 (4认同)
  • 很好,我认为是最完整的答案。应该更高。 (2认同)
  • 我搜索这个主题的原因实际上是 Go。很高兴看到我不是唯一一个意识到 .bashrc 不是正确位置的人。;) (2认同)

Fra*_*til 68

export声明放进去~/.bashrc.我的.bashrc包含这个:

export PATH=/var/lib/gems/1.8/bin:/home/fraxtil/.bin:$PATH
Run Code Online (Sandbox Code Playgroud)

  • @Click Upvote你需要做```source~/.bashrc```来重新加载```.bashrc```配置.然后它会工作 (12认同)
  • 需要重启吗? (7认同)
  • 仅当`PATH`尚未标记为环境变量时才需要`export`关键字 - 它几乎无条件地将其标记为.只需`PATH =/var/lib/gems/1.8/bin:/home/fraxtil/.bin:$ PATH`就会产生同样的效果. (4认同)
  • 当我把它放在`.profile`'时工作,没找到`.bashrc` (2认同)

小智 29

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

  1. 要为特定用户设置路径:您可能需要.bash_profile在用户的主目录中输入该条目.

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

    [tomcat]$ echo "export PATH=$PATH:/path/to/dir" >> /home/tomcat/.bash_profile
    
    Run Code Online (Sandbox Code Playgroud)
  2. 要为所有系统用户设置公共路径,您可能需要设置如下路径:

    [root~]# echo "export PATH=$PATH:/path/to/dir" >> /etc/profile
    
    Run Code Online (Sandbox Code Playgroud)

  • 您的发行版上的文件是名为`/ etc/profiles`的`s`吗?我没有`s`.我觉得你有一个错字. (3认同)
  • 您可能想要转义您正在写入配置文件的$.例如,回显"export PATH =\$ PATH:/ path/to/dir">>/etc/profile,这样你在该脚本运行时实际附加到变量,而不是根据它的值将其设置为文字值.执行此初始命令的时间. (3认同)

小智 12

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

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

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

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

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

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

摘自:http://www.sysadmit.com/2016/06/linux-anadir-ruta-al-path.html


Dan*_*ayo 12

您可以在Centos或RHEL上使用本地用户:

echo $"export PATH=\$PATH:$(pwd)" >> ~/.bash_profile
Run Code Online (Sandbox Code Playgroud)

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

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

source ~/.bash_profile
Run Code Online (Sandbox Code Playgroud)

重新加载# User specific environment and startup programs此评论存在于.bash_profile


小智 8

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

    vi /etc/profile
    
    Run Code Online (Sandbox Code Playgroud)

    I键进入编辑模式并将光标移动到文件末尾。额外的条目?

    export PATH=$PATH:/path/to/dir;
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. 使配置生效

    source /etc/profile
    
    Run Code Online (Sandbox Code Playgroud)

    解释?

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


Rob*_*rtG 7

昨天我在寻找一种方法将一个包含我自己的脚本的文件夹添加到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
Run Code Online (Sandbox Code Playgroud)

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


Him*_*rma 7

我认为最优雅的方式是:

1.在〜/ .bashrc文件中添加此命令运行此命令

gedit~/.bashrc

在其中添加您的路径

export PATH = $ PATH:/ opt/node/bin

2.source~/.bashrc

(Ubuntu的)

  • 你抄袭[Gimcuan Hui的答案](/sf/ask/1024658561/#38417461)时没有遗漏重要的部分吗? (2认同)

aqu*_*qua 6

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

  • @ClickUpvote:您使用什么外壳?(并且以点开头的文件被隐藏了,您需要像`ls -a`这样的文件才能看到它们。) (3认同)
  • 我在`/ home /(username)`中都没有这些文件。 (2认同)

use*_*968 5

永久添加到 PATH 变量

\n

全球的:

\n
echo "export PATH=$PATH:/new/path/variable" >> /etc/profile\n
Run Code Online (Sandbox Code Playgroud)\n

本地(仅适用于当前用户):

\n
echo "export PATH=$PATH:/new/path/variable" >> ~/.profile\n
Run Code Online (Sandbox Code Playgroud)\n

对于全局,重新启动。对于本地,重新登录。

\n

例子

\n

前:

\n
$ cat /etc/profile\n\n#!/bin/sh\n\nexport PATH=/usr/bin:/usr/sbin:/bin:/sbin\n
Run Code Online (Sandbox Code Playgroud)\n

后:

\n
$ cat /etc/profile\n\n#!/bin/sh\n\nexport PATH=/usr/bin:/usr/sbin:/bin:/sbin\nexport PATH=/usr/bin:/usr/sbin:/bin:/sbin:/new/path/variable\n
Run Code Online (Sandbox Code Playgroud)\n

或者,您可以只编辑文件“profile”:

\n
$ cat /etc/profile\n\n#!/bin/sh\n\nexport PATH=/usr/bin:/usr/sbin:/bin:/sbin:/new/path/variable\n
Run Code Online (Sandbox Code Playgroud)\n

另一种方式(感谢 gniourf_gniourf):

\n
echo 'PATH=$PATH:/new/path/variable' >> /etc/profile\n
Run Code Online (Sandbox Code Playgroud)\n
\n

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

\n
\n


小智 5

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

cd /etc/profile.d
touch custom.sh
vi custom.sh 
export PATH=$PATH:/path according to your setting/
Run Code Online (Sandbox Code Playgroud)

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

  • 您实际上不需要重新启动计算机。注销并再次登录就足够了。这是一个非常优雅的解决方案,因为无需编辑文件即可轻松撤销任何更改。指定 if 语句也很容易,这样如果系统上不存在目录,则不会将其添加到 PATH 变量中。 (2认同)

小智 5

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

echo 'export PATH=$PATH:/new/directory' >> ~/.zshrc
source ~/.zshrc
Run Code Online (Sandbox Code Playgroud)

  • 这个问题被标记为“bash”,所以这不是很有帮助。 (3认同)
  • 这是一个有效的答案 -&gt; 标题只提到 Linux,所以 bash 和 ALSO zsh 都可以...如果标记只是“bash”,我们也需要将“zsh”添加到标记中 (3认同)

Rag*_*h S 5

经过大量研究,我找到了一个简单的解决方案(我使用的是Elementary OS),其灵感来自Flutter – Linux 上的逐步安装 – Ubuntu

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

~$ sudo nano ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

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

export PATH="[FLUTTER_SDK_PATH]/flutter/bin:$PATH"
Run Code Online (Sandbox Code Playgroud)

例如:

export PATH="/home/rageshl/dev/flutter/bin:$PATH"
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

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