设置PATH
envvar 的首选位置在哪里?
~/.profile
还是/etc/environment
?
PATH
在两个地方都设置时会怎样?最终结果是在这两个地方设置的两个值的串联吗?
设置PATH
envvar 的首选位置在哪里?
~/.profile
还是/etc/environment
?
PATH
在两个地方都设置时会怎样?最终结果是在这两个地方设置的两个值的串联吗?
Answers:
摘要:
如果您只想为当前用户而不是为计算机的所有用户/your/additional/path
向PATH
变量添加路径(例如),则通常将其放在这~/.profile
两个示例之一的末尾,例如:
PATH="/your/additional/path:$PATH"
PATH="$PATH:/your/additional/path"
请注意,路径优先级从左到右递减,因此第一个路径具有最高优先级。如果您在的左侧添加路径,则路径$PATH
将具有最高优先级,并且该位置的可执行文件将覆盖所有其他路径。如果在右侧添加路径,则路径优先级最低,其他位置的可执行文件将是首选。
然而,如果你需要设置环境变量为所有用户,我还是不建议动人/etc/environment
,但与创建的文件名结尾的文件.sh
中/etc/profile.d/
。该/etc/profile
脚本和其中的所有脚本/etc/profile.d
是每个用户个人的全局等效项,~/.profile
并在初始化期间由所有shell作为常规shell脚本执行。
更多详情:
/etc/environment
是系统范围的配置文件,表示所有用户都在使用它。但是它归所有者所有root
,因此您需要成为管理员用户并用于对其sudo
进行修改。
~/.profile
是您自己用户的个人shell初始化脚本之一。每个用户都有一个文件,可以编辑其文件而不会影响其他文件。
/etc/profile
并且/etc/profile.d/*.sh
是等效~/.profile
于每个用户的全局初始化脚本。但是,全局脚本在用户特定脚本之前执行;并且main 在退出之前立即/etc/profile
执行所有*.sh
脚本/etc/profile.d/
。
该/etc/environment
文件通常仅包含以下行:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
它将PATH
系统上所有用户的变量设置为该默认值,不应以主要方式对其进行更改。至少你不应该删除任何类似的重要路径/bin
,/sbin
,/usr/bin
并/usr/sbin
从它。
每个用户的每个外壳程序都会将此文件作为第一个配置文件之一读取。请注意,它不是shell脚本。它只是一个以某种方式解析的配置文件,并且可能仅包含环境变量分配!
该~/.profile
文件可以包含许多内容,默认情况下,它包含检查~/bin
目录是否存在并将其添加到用户现有PATH
变量中的其他内容,例如(在16.04之前的旧版Ubuntu上-无条件地将其添加):
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
您会看到在PATH
这里重用了旧值,并且新路径仅追加到开头,而不是覆盖所有内容。手动添加新路径时,还应始终将旧$PATH
值保留在新字符串中的某个位置。
该初始化脚本只能由其所属的用户的外壳读取,但是还有另一个条件:
# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
因此,如果您使用默认的Bash shell,则应确保没有~/.bash_profile
或~/.bash_login
希望更改~/.profile
对用户有影响。
有关环境变量的完整理解,请参见:https : //help.ubuntu.com/community/EnvironmentVariables
~/.profile
,不检查的存在~/bin
,而只是检查以下内容:PATH="$HOME/bin:$HOME/.local/bin:$PATH"
/etc/skel/.profile
在16.04中有我提到的行。您显然在先前版本中创建了您的用户。
这个答案主要是关于在不同的配置文件中指定类似的环境变量时
PATH
所分配的顺序。我也介绍了通常应在何处进行设置,但下面的列表未按照应考虑使用它们的顺序列出文件。有关PATH
在Ubuntu中设置和其他环境变量的一般信息,我还建议阅读EnvironmentVariables以及该问题的其他答案。
设置的首选位置PATH
取决于您需要为其设置用户的时间以及设置时间和方式。决定的一部分将是要为所有用户还是基于每个用户设置环境变量。如果您不确定,建议您只为一个用户(例如您的帐户)而不是系统范围内的用户设置它。
如AlexP所说,PATH
环境变量将具有它最近分配的值。实际上,在大多数情况下,您会设置PATH
,将旧值包含PATH
在新值中,以便保留先前的条目。
因此,实际上,当PATH
从多个文件设置时,它通常包含所有文件中给定的条目。但这只是因为设置该PATH
变量的所有文件(第一个文件除外)通常都引用该变量本身,从而导致其旧值包含在新变量中。
因此,您实际上是在要求PATH
各种文件中的设置生效的顺序。
PATH
下面列出了要设置的通用通用场所,顺序是用户登录时生效的顺序,而不是通常应考虑使用的顺序。下面列出的每个位置PATH
在某些情况下都是设置的合理选择,但大多数情况下只有少数几个是不错的选择。
在下面的列表中,您会看到一些目录名称,例如~/.profile
。如果您不熟悉tilde扩展,请~/
参考当前用户的主目录。我主要将此语法用于紧凑性。Shell脚本支持该功能,但PAM配置文件不支持。
/etc/environment
Ubuntu上的PAM导致/etc/environment
设置列出的环境变量(如果该文件存在),默认情况下会设置该文件。这就是最常见的设置所有用户的环境变量的方式。
$ cat /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
如果必须为所有用户帐户而不是仅为用户帐户设置环境变量,那么修改该文件可能是最佳选择。我建议先备份它。备份此文件的一种方法是运行:
sudo cp /etc/environment /etc/environment.orig
该.orig
扩展没有特别要求-你可以感受到良好的命名备份文件的东西,这不是混淆或已被使用。(另外.orig
,.old
,.backup
和.bak
是常见的。)
您可以在任何的方式编辑这个文件,您可以编辑任何其他文件作为根用户(sudoedit /etc/enviromnment
,sudo nano -w /etc/environment
,gksudo gedit /etc/environment
等)
/etc/environment
不支持自动包含变量的旧值。但这通常是不必要的,因为在大多数情况下,您都会通过编辑为所有用户设置环境变量,无论如何/etc/environment
,您都希望将其作为用户登录时的初始值。然后,用户可以根据需要更改它。通常,这样做对用户有利。
/etc/security/pam_env.conf
PAM从中读取所有用户的环境变量/etc/security/pam_env.conf
,指定的语法与每个用户~/.pam_environment
文件中使用的语法相同(请参见下文)。
如果在/etc/environment
和中都设置了相同的环境变量/etc/security/pam_env.conf
,pam_env.conf
则使用in中的值-即使该值指定为DEFAULT
而不是OVERRIDE
。
但是,当您environment
用中的一个替换行时pam_env.conf
,可以包括被替换值的内容。有关.pam_environment
详细信息,请参见以下部分(因为它使用相同的语法)。
通常不需要编辑pam_env.conf
,如果要这样做,则应格外小心,因为格式错误的行通常会阻止所有普通用户帐户登录!例如,默认pam_env.conf
包含以下行:
#PATH DEFAULT=${HOME}/bin:/usr/local/bin:/bin\
#:/usr/bin:/usr/local/bin/X11:/usr/bin/X11
这是几个示例之一。它说明的一件事是如何使用来将工作分配到多行中\
。假设您只取消第一行的注释,但忘记了第二行的注释:
PATH DEFAULT=${HOME}/bin:/usr/local/bin:/bin\
#:/usr/bin:/usr/local/bin/X11:/usr/bin/X11
不要这样!
我只是偶然地对自己进行了测试,这阻止了任何用户成功登录。要修复它,我必须以恢复模式启动并将其改回。(幸运的是,我是在仅用于测试事物的虚拟机上执行此操作的,因此它不会给我造成任何麻烦。)
.pam_environment
在用户的主目录中为单个用户设置环境变量的一种方法是让该用户.pam_environment
在其主目录中进行编辑(或创建)。在此文件中设置的值将取代在全局/etc/environment
文件中设置的值。
.pam_environment
不是最初创建用户帐户时复制到用户主文件夹中的文件框架的一部分。但是,如果您在主目录中创建该文件,则可以使用它来设置环境变量,例如PATH
。与/etc/environment
(但类似/etc/security/pam_env.conf
)不同,每用户.pam_environment
文件确实支持将环境变量的旧值扩展为新值。但是,它们不是shell脚本,因此您必须使用特殊的语法来实现这一点,该语法与在的文件中使用的语法有所不同.profile
。
例如,如果您的bin2
主目录中有一个目录想要添加到的末尾PATH
,则可以通过将以下行添加到来完成此操作.pam_environment
:
PATH DEFAULT=${PATH}:/home/@{PAM_USER}/bin2
看到的~/.pam_environment
小节的EnvironmentVariables(从中上面的例子中紧密地适应的),man pam_env
以及man pam_env.conf
进一步的细节。
尽管这曾经被吹捧为Ubuntu用户更改或添加环境变量的首选方式,并且仍然被认为是一种合理且可以接受的选择,但是在编辑时应格外小心.pam_environment
。就像对系统范围的编辑一样/etc/security/pam_env.conf
(请参见上文),用户.pam_environment
文件中的格式错误的行将阻止登录成功。(我已经测试此-故意这段时间)有关如何信息的建议已演变,看到贡纳尔Hjalmarsson的评论 下面和这个ubuntu-devel
讨论。
通常,这种错误比格式错误的行严重得多pam_env.conf
,因为它仅影响一个用户。但是,如果桌面版Ubuntu系统只有一个允许登录的用户帐户,则编辑.pam_environment
时发生的错误与错误编辑一样严重pam_env.conf
-如果您尚未登录,则将无法进行在不以恢复模式(或从实时USB等)启动的情况下修复该问题。
(如果您确实拥有其他用户帐户,则可以以其他用户身份登录并解决问题。即使他们不是管理员并且无法sudo
root用户,他们仍然可以运行并提示您输入(不是他们的)密码来宾帐户无法执行此操作,因为该帐户被禁止使用其他用户的身份。)su your-account
su
/etc/profile
和其中的文件/etc/profile.d/
当作为登录shell调用时bash
,兼容Bourne的shell(包括Ubuntu中的默认用户shell)运行命令/etc/profile
。
Ubuntu的/etc/profile.d
结尾是:
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
这也会导致/etc/profile.d/
目录中名称以其结尾的任何文件中的命令也.sh
运行。
大多数显示管理器也会使中的命令/etc/profile
(从而使中的文件/etc/profile.d
)也用于图形登录。但是,并非所有人都这样做,这是支持使用PAM提供的功能的一个重要论点(请参见上文)-除非永远不会有任何图形登录到该系统,例如,没有安装GUI的服务器。
在中设置系统范围的环境变量是传统/etc/profile
做法,但这通常不再是最佳选择。如果您不能在中设置环境变量/etc/environment
,而必须为所有用户设置环境变量,那么在其中创建一个新文件/etc/profile.d/
要比对其/etc/profile
本身进行编辑要好。原因之一是,在升级Ubuntu时,可能会有一个新的默认/etc/profile
文件。根据您执行升级的方式,将保留旧文件(带有您的更改),并保留该特定的更新配置文件,或者提示您处理该情况。
如果在/etc/profile
和中都设置了相同的环境变量,并且在中设置了一个或多个文件/etc/profile.d
,最后执行哪个?这取决于/etc/profile
设置它们的命令是在profile.d
源文件之前还是之后出现(通过上面引用的代码)。输入的命令/etc/profile
按照它们出现的顺序执行。
/etc/profile
是一个外壳脚本,其语法是不一样的,上面讨论的PAM配置文件的。其语法与每个用户~/.profile
文件的语法相同(请参见下文)。
如果您需要编写代码来确定是否要向其中添加特定目录PATH
(并向所有用户这样做),则将无法使用/etc/environment
或/etc/security/pam_env.conf
执行该操作。这也许是主要的情况下,最好是使用/etc/profile
或/etc/profile.d/
代替。
.bash_profile
在用户的主目录中如果用户拥有~/.bash_profile
,则bash会使用它代替~/.profile
或~/.bash_login
(请参见下文)。通常.bash_profile
,您的主目录中不应包含。
如果这样做,通常应该包含一个源命令~/.profile
(例如. "$HOME/.profile"
)。否则,每个用户.profile
文件的内容将根本不运行。
.bash_login
在用户的主目录中如果用户~/.bash_login
使用~/.profile
,除非~/.bash_profile
存在,否则bash会使用它代替(请参阅下文),在这种情况下,除非从`〜/ .bash_login发出,否则不会使用其他任何东西。
与一样.bash_profile
,您通常不应.bash_login
在主目录中有文件。
.profile
在用户的主目录中。当Bourne风格的shell作为登录shell运行时,它将在/etc/profile
其中运行命令(通常包括使文件中的命令/etc/profile.d/
运行的命令-参见上文)。之后,它将.profile
在用户的主目录中运行命令。该文件对于每个用户都是单独的。(实际上,Bash可以运行,.bash_profile
或者.bash_login
如果存在的话,而是运行-但是,对于Ubuntu系统上的用户,这些文件很少应该存在或确实存在。有关详细信息,请参见上文和Bash手册中的6.2 Bash启动文件。)
~/.profile
因此,它是用户放置登录时运行的命令的主要场所。这是设置您的传统位置PATH
,但是由于Ubuntu具有pam_env模块并支持~/.pam_environment
,因此您应该考虑使用它。
与一样/etc/profile
,尽管大多数显示管理器都不会为图形登录运行此文件。这是一个理由,更喜欢~/.pam_environment
设置环境变量(就像一个可能更喜欢/etc/environment
到/etc/profile
)。
您还可以扩大环境变量,包括PATH
自己,当你设置PATH
的.pam_environment
(见上文)。但是,如果需要以PATH
更复杂的方式进行设置,则可能不得不使用您的设置.profile
。特别是,如果您想在用户每次登录时检查目录是否存在,并且仅在目录存在的情况下将其添加到目录PATH
中,那么您将无法使用.pam_environment
文件将该目录添加到中PATH
。
例如,.profile
Ubuntu上的默认每用户文件以以下结尾:
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
有关详细信息,请参见Gunnar Hjalmarsson对Byte Commander答案的评论。
这将检查您是否具有bin
主目录的子目录。如果是这样,则会将该子目录添加到的开头PATH
。
用户登录时,还有其他设置环境变量的方法,这些方法在很大程度上取决于登录类型。例如,您有时可能会为图形登录或仅基于SSH的远程登录设置环境变量。上面的列表不涵盖此类情况。
我遗漏了一些文件,人们有时会在其中定义环境变量,例如~/.bashrc
和/etc/bash.bashrc
,因为通常不建议将它们设置PATH
为环境变量,而且很少有您为此目的实际使用它们。如果使用这些文件向其中添加目录PATH
,则有时它们会被添加很多次,并且在您检查时会非常混乱$PATH
。(在极端情况下,这可能会使速度变慢,但通常只是保持所有内容的清洁和易于理解。)
由于bash
是Ubuntu的默认用户登录外壳程序,并且大多数用户都使用它或其他兼容POSIX的外壳程序,因此我省略了有关如何在其他非伯恩风格的外壳程序中设置环境变量的信息tcsh
。
/etc/environment
/ ~/.pam_environment
作为该建议的文件。在咨询了开发人员之后,我将其更改为PAM和/etc/profile.d/*.sh
/ 之间的中性~/.profile
,并且我仍然倾向于这种方式。
/etc/profile.d/*.sh
/的重要参数~/.profile
是语法更简单,并且在出现错误的情况下lightdm / gdm是可以原谅的(即使语法错误也无法阻止您登录,而只会导致警告消息)。
pam_env.so
,你的意思是pam_env.conf
?
pam_env.conf
。谢谢!我已对其进行修改以进行修复。
设置环境变量的首选位置取决于几件事:
/etc/environment
因为不存在未经授权访问的危险。/etc/environment
,但~/.profile
用户都应在与系统每个用户有关的位置中设置他们的访问权限,因为它位于每个用户的主目录中。系统将在读取/etc/environment
之前先进行读取~/.profile
。没有串联发生,就像Alex P所说的那样,最后的路径分配占了上风。
在确定如何的因素更详细的研究~/.profile
,并/etc/environment
与其他这样的位置打出去,在这里和这里,因为这些因素会影响你如何使用这些位置。