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


879

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

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

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

我该如何做才能将其永久设置?

Answers:


229

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

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

系统范围

  1. /etc/environment唯一作业列表,允许引用。完善,用于将全系统目录像/usr/local/something/binPATH变量或定义JAVA_HOME。由PAM和SystemD使用。
  2. /etc/environment.d/*.conf唯一作业列表,允许引用。完善,用于将全系统目录像/usr/local/something/binPATH变量或定义JAVA_HOME。可以将配置分为多个文件,通常每个工具(Java,Go,NodeJS)一个文件。由SystemD使用,在设计上不会将这些值传递给用户登录Shell。
  3. /etc/xprofile启动X Window系统会话时执行的Shell脚本。将为每个登录X Window System的用户运行此命令。对于PATH对每个用户都有效的条目,这是一个不错的选择/usr/local/something/bin。该文件包含在其他脚本中,因此请使用POSIX Shell语法而不是用户Shell的语法。
  4. /etc/profile/etc/profile.d/*Shell脚本。对于仅使用shell的系统,这是一个不错的选择。这些文件仅在登录模式下由Shell读取。
  5. /etc/<shell>.<shell>rc。Shell脚本。这是一个糟糕的选择,因为它是特定于单个shell的。在非登录模式下使用。

用户会话

  1. ~/.pam_environment。唯一作业列表,不允许引用。如果是X Window系统会话或shell,则在每个用户会话开始时由PAM加载。您不能引用其他变量,包括HOMEPATH因此用途有限。由PAM使用。
  2. ~/.xprofileShell脚本。当用户登录到X Window System系统时,将执行此操作。此处定义的变量对每个X应用程序都是可见的。PATH用诸如~/bin~/go/bin或定义用户特定GOPATH或的值扩展的完美选择NPM_HOME。该文件包含在其他脚本中,因此请使用POSIX Shell语法而不是用户Shell的语法。通过快捷方式启动的图形文本编辑器或IDE将看到这些值。
  3. ~/.profile~/.<shell>_profile~/.<shell>_loginshell脚本。仅对从终端或终端仿真器启动的程序可见。对于仅使用shell的系统来说,这是一个不错的选择。由Shell在登录模式下使用。
  4. ~/.<shell>rc。Shell脚本。这是一个糟糕的选择,因为它是特定于单个shell的。由Shell在非登录模式下使用。

笔记

Wayland上的Gnome启动用户登录Shell来获取环境。它有效地利用登录shell配置~/.profile~/.<shell>_profile~/.<shell>_login文件。

说明书

  • 环境
  • 环境
  • 重击
  • 短跑

发行特定文档

有关

登录外壳程序和非登录外壳程序之间的区别?


4
谢谢您的详细回答,这个应该更高。也许也.bash_profile应该添加到列表中?
James Ko

2
@JamesKo是第4名
trve.fa7ad

1
我认为最好的答案是建议/etc/environment。但是我可以不注销并重新登录而刷新它吗?有时我不使用bash或sh,所以source /etc/environment不起作用。
banan3'14

2
很好,我认为是最完整的答案。应该更高。
Peter Gloor

2
我搜索该主题的原因实际上是Go。很高兴看到我不是唯一意识到.bashrc不是正确的地方的人。;)
Peter Gloor

1039

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

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

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

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

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

source ~/.profile 
or
source ~/.bashrc

11
有几个问题。1)$PATH和之间不应该有一个冒号/usr/bin。2)/usr/bin甚至应该在那里。3)您不应该使用/usr/local/bin吗?
Batandwa 2014年

197
请注意:通常认为在bash PATH的末尾留一个冒号是一个安全漏洞,因为这样做可以使bash在找不到所需可执行文件的情况下在当前目录中查找。查找此帖子以寻求更多信息的用户应被告知此信息。
erewok 2014年

51
@AdamRobertson这是不安全的-考虑以下情况:解压缩tarball,然后cd将其解压缩到目录中,然后运行ls---然后意识到tarball中有一个恶意程序被调用ls
莉莉·钟

21
对我而言,它是.bash_profile,而不是.profile。似乎每个人都不一样。
donquixote

9
我认为我大大提高了此答案的质量,并解决了其他用户提出的一些问题。每个路径导出或每个调整路径的命令都应始终确保使用冒号分隔现有路径。切勿使用前导或尾部冒号,并且当前目录也不应位于路径中。
埃里克·罗伯逊

243

在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

更新:

如果您使用zsh(又名Z Shell),请在以下注释的后面添加此行/etc/zsh/zshenv

source /etc/environment

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


13
并非所有系统都具有/ etc / environment
user3439968 2014年

9
FWIW $PATH也在/etc/profileArch Linux中定义。
Sparhawk

3
@ e-sushi我实际上对此感到震惊。我本人正在使用ubuntu 14.04.1。我可以向你保证的文件来了内置的。
trve.fa7ad

2
在/ etc / environment下尝试了所有建议之后,让所有建议均无效,我终于偶然发现了这一点。我也在Ubuntu 14.04上,这是重启后实际上唯一更改PATH变量的一个。
Chockomonkey

4
用户应在更新环境文件后重新启动PC。
Harish_N

70

export声明放在中~/.bashrc。我的.bashrc包含以下内容:

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

7
需要重启吗?
点击Upvote

2
当我将其放在.profile'时工作正常,找不到.bashrc
单击Upvote

它可能取决于确切的系统;我不确定确切的条件决定执行哪个文件。很高兴,问题解决了。
Fraxtil

12
@Click Upvote您需要执行source ~/.bashrc重新加载.bashrc配置。然后它将起作用
BigSack 2014年

4
export仅当PATH尚未将其标记为环境变量时才需要该关键字-几乎无条件地将其标记为。简直PATH=/var/lib/gems/1.8/bin:/home/fraxtil/.bin:$PATH会有相同的效果。
查尔斯·达菲

30

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

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

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

    [tomcat]$ echo "export PATH=$PATH:/path/to/dir" >> /home/tomcat/.bash_profile
  2. 要为所有系统用户设置通用路径,您可能需要设置以下路径:

    [root~]# echo "export PATH=$PATH:/path/to/dir" >> /etc/profile

3
在您的发行版中,该文件是否/etc/profiles带有s?我的没有s。我想你有错字。
克里斯·约翰逊

3
您可能想转义要写入配置文件的$。例如,echo“ export PATH = \ $ PATH:/ path / to / dir” >> / etc / profile,这样,您实际上在脚本运行时将其追加到变量上,而不是根据其值将其设置为文字值执行此初始命令的时间。
BuvinJ

15

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

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

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

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

source ~/.bash_profile

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



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

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


7

我认为最优雅的方法是:

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

gedit〜/ .bashrc

在其中添加您的路径

导出PATH = $ PATH:/ opt / node / bin

2.来源〜/ .bashrc

(Ubuntu)


6

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


2
我没有这些文件/home/(username)
单击Upvote 2013年

3
@ClickUpvote:您使用什么外壳?(并且以点开头的文件被隐藏了,您需要像ls -a看它们一样的东西。)
David Schwartz 2013年

如果您没有任何这些文件(bashrc或配置文件),则可以手动创建它们,它们将自动使用
trve.fa7ad 2014年

4

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


1
不。您不应该在这里使用双引号!echo 'export PATH=$PATH:/new/path/variable'...而且,export由于该PATH变量很可能已被标记为已导出,因此该关键字很可能无用。
gniourf_gniourf

不,您应该使用双引号,因为单引号中的$ PATH不能插值。而且BTW导出也很有用。
user3439968

我知道了。您可以使用双引号或单引号,因为$ PATH在执行echo时插值或在/ etc / profile执行时插值。
user3439968

1
@ user3439968实际上,如果要从多个文件追加到$ PATH,双引号会引起很多问题。考虑:当您使用双引号时,$ PATH将被转换为具有所有先前定义的PATH目录的静态字符串。说您/usr/local使用附加到它~/.bashrc。现在,如果您打算/opt/bin使用/etc/bash.bashrc; 附加到相同的变量;$ PATH将转换为相同的静态字符串,结果$ PATH将被替换而不是附加到... ...这将是系统优先选择一个文件而不是另一个文件的原因
trve.fa7ad 2015年

4

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

#vi /etc/profile

按“ i”键进入编辑状态,并将光标移至文件末尾,其他条目:

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

按“ Esc”键退出编辑状态,':wq'保存文件。

2.使配置生效

source /etc/profile

说明:配置文件适用于所有用户,如果只想对活动用户有效,请设置“ .bashrc”文件


4

经过大量研究,在以下链接的启发下,我找到了一个简单的解决方案(我正在使用基本OS)。

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

~$ sudo nano ~/.bashrc

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

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

例如 :

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

在此处输入图片说明

我相信这是在Ubuntu发行版中为扑朔迷离设置路径的永久解决方案

希望这会有所帮助。


3

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

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

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

上面提到的文件(如果系统变量在哪里)。


3

通过行添加到/etc/profile.d文件夹脚本。文件夹中的每个脚本都会在登录时自动执行。[name_of_script].shexport PATH=$PATH:/dir/etc/profile.d/etc/profile


建议您自定义环境的方式
Yuriy 2015年

1
仅当您希望设置在系统范围内使用时,这可能不是最常见的用例。大多数人希望(或应该希望)在本地设置路径,因为大多数用户/角色正在根据上下文进行不同的操作,并且所作的假设越少越好。
mpowered 2015年

@mpowered,是的,这仅适用于系统范围。如果要在本地更改PATH,则应在〜/ .profile或〜/ .bashrc中添加相同的导出。在这里,您应该考虑将登录外壳读取为〜/ .profile,将交互式外壳读取为〜/ .bashrc。这非常重要,因为例如ssh不会登录,因此〜/ .profile将不会被读取。/ etc / profile中的suse源〜/ .bashrc等几种发行方式。但这并不是所有Linux都常见”
Yuriy

3

Zues77有一个正确的想法。行动党没有说“我怎样才能做到这一点”。OP想知道如何永久附加到$ PATH:

sudo nano /etc/profile

这是为所有内容设置的地方,并且是需要$ PATH的所有内容进行更改的最佳位置


3

我的回答是go-lang关于on 的设置的。Ubuntu linux/amd64我遇到了同样的麻烦:设置环境变量(GOPATHGOBIN)的路径,在终端退出时丢失它,并source <file_name>每次都使用它来重建它 。错误是放置路径(GOPATHGOBIN)在~/.bash_profile文件夹中。浪费了好几个小时后,我发现,解决办法是把GOPATHGOBIN~/.bash_rc以这样的方式文件:

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

这样,go安装工作正常,并且没有路径损失。

编辑1:此问题可能与之相关的原因是,非ubuntu终端(例如您在其中运行go代码的ubuntu终端或gnome-terminal)~./bash_rc的设置是从~/.bash_profile文件中获取的,而登录shell的设置是从文件中获取的,并且~/.profile如果~/.bash_profile文件不可访问,则从文件中删除。


3

假设您正在运行MacOS,并且您拥有一个值得信任的二进制文件,并且希望在您的系统中使用该二进制文件,但不一定要将该二进制文件添加到PATH的目录中,则可以选择复制/移动的二进制文件/usr/local/bin,该文件应该已经在您的PATH中。这将使该二进制文件可执行,就像您可能已经在终端中访问的任何其他二进制文件一样。


3

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

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

2
该问题被标记为bash,因此不是很有帮助。
Laurenz Albe

2
这是一个有效的答案->标题仅提及Linux,因此bash和ALSO zsh也可以...如果标记仅为“ bash”,我们也需要在标记中添加“ zsh”
Carlos Saltos '18

2

最好的简单方法是以下行:
PATH="<directory you want to include>:$PATH"
在主目录的.bashrc文件中。
即使关闭终端或重新启动PC,它也不会重置。其永久


1
@quant如果您说了什么,它将永久设置您的设置。即使关闭终端,它也将起作用。
爱德华·托瓦尔兹

1

我认为最优雅的方法是:

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

if [ -d "new-path" ]; then
  PATH=$PATH:new-path
fi

2.来源〜/ .bashrc

(Ubuntu)


并在上面显示路径:printf“%s \ n” $ PATH
Robot70 '18

1

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

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

重新启动您的计算机,在这里我们走的路将永远欢呼。


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

0

对于Debian发行版,您必须:

    - edit ~/.bashrc  e.g: vim ~/.bashrc 
    - add export PATH=$PATH:/path/to/dir
    - then restart your computer. Be aware that if you edit ~/.bashrc  as root, your environment variable you added will work only for root

0

这是单线的。会在中添加一行.bashrc。Tha行将检查目录是否已添加到路径,如果没有,则追加。这样可以防止在每次获取源文件时都在路径中复制目录.bashrc

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

source ~/.bashrc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.