pka*_*mol 102 paths environment-variables
设置PATHenvvar的首选位置在哪里?
~/.profile或者/etc/environment?
PATH在两个地方都设置时是什么情况?最终结果是在这两个地方设置的两个值的串联吗?
Byt*_*der 117
概括:
如果您只想为当前用户而不是计算机的所有用户/your/additional/path向PATH变量添加路径(例如),通常将其放在这~/.profile两个示例之一的 like末尾:
PATH="/your/additional/path:$PATH"
PATH="$PATH:/your/additional/path"
Run Code Online (Sandbox Code Playgroud)
请注意,路径优先级从左到右递减,因此第一条路径的优先级最高。如果您在 左侧添加您的路径$PATH,它将具有最高优先级,并且该位置中的可执行文件将覆盖所有其他路径。如果您在右侧添加您的路径,它将具有最低优先级,而来自其他位置的可执行文件将是首选。
然而,如果你需要设置环境变量为所有用户,我还是不建议感人/etc/environment,但创造与结尾的文件名的文件.sh中/etc/profile.d/。该/etc/profile脚本,并在所有的脚本/etc/profile.d是每个用户的同等学历的个人~/.profile和他们的初始化期间,所有的炮弹普通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"
Run Code Online (Sandbox Code Playgroud)
它将PATH系统上所有用户的变量设置为此默认值,不应以重大方式更改。至少你不应该删除任何类似的重要路径/bin,/sbin,/usr/bin并/usr/sbin从它。
该文件被每个用户的每个 shell 读取为第一个配置文件之一。请注意,它不是 shell 脚本。它只是一个以某种方式解析的配置文件,它可能只包含环境变量赋值!
该~/.profile文件可以包含许多内容,默认情况下它包含检查~/bin目录是否存在并将其添加到用户的现有PATH变量中的其他内容,就像这样(在 16.04 之前的较旧 Ubuntu 版本 - 无条件添加 - 以及 18.04 ,它还添加了“~/.local/bin”):
# 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)
您会看到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.
Run Code Online (Sandbox Code Playgroud)
因此,如果您使用默认的 Bash shell,您应该确保您没有~/.bash_profile或者~/.bash_login如果您希望更改~/.profile对您的用户产生影响。
要全面了解环境变量,请参阅:https : //help.ubuntu.com/community/EnvironmentVariables
相关问题:bash.bashrc 和 /etc/environment 文件的区别
Eli*_*gan 34
这个答案主要是关于在不同的配置文件中指定时分配环境变量的顺序
PATH。我还介绍了您通常应该在哪里设置它们,但下面的列表没有按照您应该考虑使用它们的顺序列出文件。有关PATH在 Ubuntu 中设置和其他环境变量的一般信息,我还建议阅读EnvironmentVariables和此问题的其他答案。
设置的首选位置PATH取决于您需要为其设置的用户以及您希望设置的时间和方式。您的决定的一部分将是您是否希望为所有用户或每个用户设置一个环境变量。如果您不确定,那么我建议只为一个用户(例如,您的帐户)而不是系统范围设置它。
正如AlexP 所说,PATH环境变量将具有它最近分配的值。在实践中,大多数情况下,您在设置 时PATH,会将 的旧值包含PATH在新值中,以便保留以前的条目。
因此,实际上,当PATH从多个文件设置时,它通常包含所有文件中给出的条目。但这只是因为所有设置它的文件,除了第一个,通常引用PATH变量本身,导致它的旧值包含在新值中。
因此,您实际上是在询问PATH各种文件中的设置生效的顺序。
PATH下面列出了要设置的常见、通用位置,它们在用户登录时生效的顺序,而不是您通常应该考虑使用它们的顺序。下面列出的每个地方PATH 在某些情况下都是合理的设置选择,但大多数情况下只有少数是不错的选择。
在下面的列表中,您将看到一些目录名称,例如~/.profile. 如果您不熟悉波浪号扩展,则~/指的是当前用户的主目录。我主要使用这种语法来实现紧凑性。它在shell脚本支持,但不是在PAM配置文件。
/etc/environmentUbuntu 上的PAM会导致/etc/environment设置 中列出的环境变量,如果该文件存在,默认情况下会设置。这就是所有用户的环境变量最常见的设置方式。
$ cat /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)
如果您必须为所有用户帐户设置环境变量,而不仅仅是您的用户帐户,那么修改该文件可能是您的最佳选择。我建议先备份它。备份此文件的一种方法是运行:
sudo cp /etc/environment /etc/environment.orig
Run Code Online (Sandbox Code Playgroud)
该.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.confPAM 从 读取所有用户的环境变量,/etc/security/pam_env.conf使用与每个用户~/.pam_environment文件中使用的语法相同的语法指定(见下文)。
当在/etc/environmentand 中设置相同的环境变量时,将使用 in/etc/security/pam_env.conf的值pam_env.conf——即使该值被指定为DEFAULT而不是OVERRIDE。
但是,当您environment用 in取代一行 in时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
Run Code Online (Sandbox Code Playgroud)
这是作为几个示例之一呈现的。它说明的一件事是如何使用\. 假设您只取消注释第一行,但忘记取消注释第二行:
PATH DEFAULT=${HOME}/bin:/usr/local/bin:/bin\
#:/usr/bin:/usr/local/bin/X11:/usr/bin/X11
Run Code Online (Sandbox Code Playgroud)
不要这样做!
我只是偶然测试了一下,它阻止了任何用户成功登录。要修复它,我必须以恢复模式启动并将其更改回来。(幸运的是,我在仅用于测试事物的虚拟机上执行此操作,因此没有给我带来任何麻烦。)
.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
Run Code Online (Sandbox Code Playgroud)
看到的~/.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 等)启动的情况下修复它。
(如果您确实有其他用户帐户,那么您可以以其他用户身份登录并解决问题。即使他们不是管理员并且无法sudoroot,他们仍然可以运行并被提示输入您的(而不是他们的)密码.但是,guest帐户不能这样做,因为它被禁止用来冒充其他用户的身份。)su your-accountsu
/etc/profile和里面的文件/etc/profile.d/Bourne 兼容的 shell(包括bashUbuntu 中的默认用户 shell)在/etc/profile作为登录 shell 调用时运行命令。
Ubuntu 的/etc/profile结尾是:
$ cat /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)
这会导致/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的主目录中通常不应该有 a 。
如果你这样做,它通常应该包含一个命令来获取~/.profile(例如,. "$HOME/.profile")。否则,每个用户.profile文件的内容根本不会运行。
.bash_login在用户的主目录中如果用户有~/.bash_login,bash 使用它而不是~/.profile(见下文),除非~/.bash_profile存在,在这种情况下,除非来自`~/.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.
例如,.profileUbuntu 上的默认每用户文件过去以:
sudo cp /etc/environment /etc/environment.orig
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅Gunnar Hjalmarsson对Byte Commander 的回答的评论。
这会检查您是否有bin主目录的子目录。如果是这样,它会将该子目录添加到您的PATH.
当用户登录时,还有其他方式设置环境变量,这些方式在很大程度上取决于登录类型。例如,您可能偶尔会为图形登录或仅为基于 SSH 的远程登录设置环境变量。上面的列表不包括这种情况。
我遗漏了一些人们有时会定义环境变量的文件,例如~/.bashrc和/etc/bash.bashrc,因为通常不建议将它们设置为设置位置PATH,而且您实际上很少将它们用于此目的。如果您使用这些文件向其中添加目录PATH,那么它们有时会被添加多次,并且在您检查时会非常混乱$PATH。(在极端情况下,这可能会减慢速度,但通常情况下,这只是保持一切干净和易于理解的问题。)
由于bashUbuntu 是用户的默认登录 shell,并且大多数用户使用它或其他一些与 POSIX 兼容的 shell,因此我省略了有关如何在其他非 Bourne 风格的 shell 中设置环境变量的信息,例如tcsh.
小智 5
/etc/environment文件不是脚本文件,您不能在那里使用导出,并且它不支持 $HOME 类型的变量扩展,仅支持 simplevariable=value 对。因此,要使用该文件,您只需将路径附加到现有定义中,该定义专门用于系统范围的环境变量设置。每行一个。具体来说,该文件存储系统范围的区域设置和路径设置。
~/.profile - 每当执行 bash shell 时都会执行此文件,通常是推荐的环境变量,但它的缺点是只能由登录 shell 调用,因此为了使其生效,您需要注销并重新登录 - 或者至少启动一个新的登录 shell。
| 归档时间: |
|
| 查看次数: |
233786 次 |
| 最近记录: |