在/ etc / environment和.profile中设置PATH变量

设置PATH envvar的首选位置在哪里?

~/.profile/etc/environment

在两个地方设置PATH的情况是什么? 最终结果是在这两个地方设置的两个值的串联吗?

摘要:

  • 如果你想为你当前用户的PATH变量添加路径(例如/your/additional/path )而不是计算机的所有用户,你通常把它放在~/.profile的末尾,就像在其中一个这两个例子:

     PATH="/your/additional/path:$PATH" PATH="$PATH:/your/additional/path" 

    请注意,路径优先级从左向右递减,因此第一个路径具有最高优先级。 如果在$PATH的左侧添加$PATH ,它将具有最高优先级,该位置的可执行文件将覆盖所有其他位置。 如果在右侧添加路径,则优先级最低,其他位置的可执行文件优先。

  • 但是,如果您需要为所有用户设置该环境变量,我仍然不建议触摸/etc/environment而是在/etc/profile.d/创建文件名以.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 。 全局脚本在用户特定脚本之前执行; 主/etc/profile在退出之前执行/etc/profile.d/所有*.sh脚本。


  • /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都会将此文件作为第一个配置文件之一读取。 请注意,它不是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值保留在新字符串中的某个位置。

    此初始化脚本仅由其所属的用户的shell读取,但还有另一个条件:

     # ~/.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,如果您希望~/.profile的更改对您的用户有效,则应确保没有~/.bash_profile~/.bash_login


有关环境变量的完整理解,请参阅: https : //help.ubuntu.com/community/EnvironmentVariables


相关问题: bash.bashrc和/ etc / environment文件之间的区别

这个答案主要是关于在不同配置文件中指定的环境变量(如PATH的分配顺序 。 我还会介绍您通常应该设置它们的位置,但下面的列表不会按照您应该考虑使用它们的顺序列出文件。 有关在Ubuntu中设置PATH和其他环境变量的一般信息,我还建议阅读EnvironmentVariables以及此问题的其他答案。

设置PATH的首选位置取决于您需要为其设置的用户 以及您希望何时以及如何设置它。 您的部分决定将是您是要为所有用户设置环境变量还是基于每个用户。 如果您不确定,那么我建议仅为一个用户(例如,您的帐户)而不是系统范围设置它。

正如AlexP所说 , PATH环境变量将具有最近分配的值。 实际上,在大多数情况下设置PATH ,在新值中包含PATH ,以便保留先前的条目。

因此,实际上,当从多个文件设置PATH时,它通常包含所有文件中给出的条目。 但这只会发生,因为设置它的所有文件(第一个除外)通常引用PATH变量本身,导致其旧值包含在新值中。

因此,您实际上要求各种文件中的PATH设置生效的顺序。

设置PATH常用通用位置在下面按用户登录时生效的顺序列出, 而不是按照通常考虑使用它们的顺序列出。 下面列出的每个地方都是某些情况下设置PATH的合理选择,但大多数情况下只有少数是好的选择。

在下面的列表中,您将看到一些目录名称,如~/.profile 如果你不熟悉代字号扩展 , ~/指的是当前用户的主目录。 我主要使用这种语法来实现紧凑性。 它在shell脚本中受支持,但在PAM配置文件中不受支持。

1.对于所有用户: /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很常见。)

您可以使用以root用户编辑任何其他文件的任何方式编辑此文件( sudoedit /etc/enviromnmentsudo nano -w /etc/environmentgksudo gedit /etc/environment等)

/etc/environment不支持自动包含变量的旧值。 但这通常是不必要的,因为大多数情况下你会通过编辑/etc/environment为所有用户设置一个环境变量,无论如何你都希望它在用户登录时成为它的初始值。 然后用户可以随意更改它。 通常,用户能够做到这一点很好。

2.对于所有用户: /etc/security/pam_env.conf

PAM从/etc/security/pam_env.conf读取所有用户的环境变量,使用与per-user ~/.pam_environment文件中使用的相同语法指定(见下文)。

/etc/environment/etc/security/pam_env.conf设置相同的环境变量时,将使用pam_env.conf的值 – 即使该值指定为DEFAULT而不是OVERRIDE

但是,当您使用pam_env.conf的一行取代environment的一行时,您可以包含已取代值的内容。 有关详细信息,请参阅下面有关.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 

不要这样做!

我只是偶然测试了一下,它阻止了任何用户成功登录。 要修复它,我必须在恢复模式下启动并将其更改回来。 (幸运的是我在一台虚拟机上做了这个,我只用它来测试东西,所以它没有给我带来任何麻烦。)

3.对于一个用户:用户主目录中的.pam_environment

为单个用户设置环境变量的方法之一是该用户在其主目录中编辑(或创建) .pam_environment 。 此文件中设置的值将取代在全局/etc/environment文件中设置的值。

.pam_environment不是最初创建用户帐户时复制到用户主文件夹的文件框架的一部分。 但是,如果在主目录中创建该文件,则可以使用它来设置PATH等环境变量。 与/etc/environment (但/etc/security/pam_env.conf )不同,每用户.pam_environment文件支持将环境变量的旧值扩展为新值。 但是,它们不是shell脚本,您必须使用特殊语法来实现此目的,这与您在.profile文件中使用的语法有所不同。

例如,如果您的bin2目录中有一个bin2目录要添加到PATH的末尾,则可以通过将此行添加到.pam_environment.pam_environment

 PATH DEFAULT=${PATH}:/home/@{PAM_USER}/bin2 

有关更多详细信息,请参阅EnvironmentVariables 的~/.pam_environment小节 (上面的示例已经过调整), man pam_envman pam_env.conf

虽然这曾被吹捧为Ubuntu用户更改或添加环境变量的首选方式,但仍然被认为是一种合理且可接受的选择, 但在编辑.pam_environment时应该小心 。 与编辑系统范围/etc/security/pam_env.so (见上文)一样,用户的.pam_environment文件中的格式.pam_environment行将阻止登录成功。 (我已经对此进行了测试 – 这次有目的。)有关建议如何演变的信息 ,请参阅下面的 Gunnar Hjalmarsson的评论和ubuntu-devel讨论 。

一般来说 ,这样的错误要比pam_env.so的格式错误严重得多,因为它只影响一个用户。 但是,如果桌面Ubuntu系统只有一个允许登录的用户帐户,那么编辑.pam_environment时的错误就像编辑pam_env.so的错误一样糟糕 – 如果您还没有登录,那么你如果没有在恢复模式下启动(或从实时USB等),将无法修复它。

(如果你有其他用户帐户,那么你可以作为另一个用户登录并解决问题。即使他们不是管理员也不能sudo到root,他们仍然可以运行su your-account并被提示输入你的(不是他们的)密码。但是, 访客帐户不能这样做,因为禁止使用su来接受其他用户的身份。)

4.对于所有用户: /etc/profile/etc/profile.d/

Bourne兼容的shell(包括bash ,Ubuntu中的默认用户shell)在作为登录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中的/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是一个shell脚本, 其语法与上面讨论的PAM配置文件的语法不同 。 其语法与per-user ~/.profile文件的语法相同(见下文)。

如果您需要编写决定是否将特定目录添加到PATH (并且为所有用户执行此操作),您将无法使用/etc/environment/etc/security/pam_env.conf来去做。 这可能是使用/etc/profile/etc/profile.d/更好的主要情况。

5.对于一个用户: .bash_profile在用户的主目录中

如果用户有~/.bash_profile ,bash使用它而不是~/.profile~/.bash_login (见下文)。 您的主目录中通常不应该有.bash_profile

如果你这样做,它通常应该包含一个命令来源~/.profile (例如, . "$HOME/.profile" )。 否则,根本不运行每用户.profile文件的内容。

6.对于一个用户: .bash_login在用户的主目录中

如果用户有~/.bash_login ,bash使用它而不是~/.profile (见下文),除非存在~/.bash_profile ,在这种情况下,除非来自`〜/ .bash_login,否则不会使用其他任何一个。

.bash_profile ,您的主目录中通常不应该有.bash_login文件。

7.对于一个用户: .profile在用户的主目录中。

当Bourne样式的shell作为登录shell运行时,它会运行/etc/profile的命令(通常包括导致/etc/profile.d/中文件中的命令运行的命令 – 参见上文)。 之后,它在用户主目录中的.profile中运行命令。 此文件对每个用户都是独立的。 (Bash实际上运行.bash_profile.bash_login如果它们存在 – 但是,对于Ubuntu系统上的用户,这些文件很少应该存在或者确实存在。有关详细信息,请参阅上面和Bash手册中的 6.2 Bash Startup Files 。)

因此, ~/.profile是用户放置登录时运行的命令的主要场所。 它是您设置PATH的传统场所,但由于Ubuntu具有pam_env模块并支持~/.pam_environment ,您应该考虑使用它。

/etc/profile ,并非所有显示管理器都运行此文件进行图形登录,但大多数情况都是如此。 这是首选~/.pam_environment来设置环境变量的原因 (就像人们可能更喜欢/etc/environment/etc/profile )。

.pam_environment设置PATH时,可以扩展环境变量,包括PATH本身(参见上文)。 但是,如果需要以更复杂的方式设置PATH ,则可能必须使用.profile 。 特别是,如果要在每次用户登录时检查目录是否存在,并且只将其添加到PATH ,那么您将无法使用.pam_environment文件将该目录添加到PATH

例如,Ubuntu上的默认每用户.profile文件过去以

 # 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用户的默认登录shell,并且大多数用户使用它或其他一些与POSIX兼容的shell,因此我省略了有关如何在其他非Bourne样式的shell(如tcsh中设置环境变量的信息。

/ etc / environment文件不是你不能在那里使用导出的脚本文件,它不支持$ HOME类型的变量扩展,只是simplevariable = value对。 因此,要使用该文件,您只需将路径附加到现有定义,特别适用于系统范围的环境变量设置。 每行一个。 具体来说,此文件存储系统范围的区域设置和路径设置。

〜/ .profile – 每当执行bash shell时执行此文件,通常是环境变量推荐的文件,但它的缺点是只能被登录shell调用,所以为了让它生效,你需要注销并重新登录 – 或者至少启动一个新的登录shell。

设置环境变量的首选位置取决于以下几点:

  1. 你是唯一一个使用电脑的人:
    • 在这种情况下,设置它的最佳位置是在/etc/environment因为没有_unauthorized访问的危险。
  2. 如果系统被许多人使用
    • 如果所有变量都应该被访问,那么该位置将是/etc/environment ,但是
    • 如果个人用户应该选择访问它们,则每个 用户 都应该在~/.profile与系统中每个用户相关的属性,因为它位于每个用户主目录中。

在读取~/.profile之前,系统将读取/etc/environment 。 没有连接发生,并且像Alex P所说的最后一个路径分配占优势。

有关确定~/.profile/etc/environment如何与其他此类位置一起发挥作用的因素,请参阅此处和此处 ,因为这些因素将影响您使用这些位置的方式。