PATH
环境变量最好?是在
~/.profile
还是/etc/environment
?当
PATH
同时在这两个地方设置时,会出现什么情况?
最终的结果是这两个地方设置的值进行拼接吗?PATH
环境变量最好?~/.profile
还是/etc/environment
?PATH
同时在这两个地方设置时,会出现什么情况?
最终的结果是这两个地方设置的值进行拼接吗?摘要:
如果你想为当前用户的PATH
变量添加一个路径(例如/your/additional/path
),而不是为计算机上的所有用户添加,通常将其放在~/.profile
的末尾,就像下面这两个例子中的一个一样:PATH="/your/additional/path:$PATH"
PATH="$PATH:/your/additional/path"
$PATH
的左侧,它将具有最高优先级,并且该位置的可执行文件将覆盖其他所有文件。如果你将路径添加到右侧,它将具有最低优先级,并且来自其他位置的可执行文件将被优先选择。/etc/environment
,而是在/etc/profile.d/
中创建一个以.sh
结尾的文件。 /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
脚本。
~/.profile
文件不再检查~/bin
目录是否存在,而是直接添加了以下一行代码:PATH="$HOME/bin:$HOME/.local/bin:$PATH"
。 - Gunnar Hjalmarsson/etc/skel/.profile
文件包含了我提到的那一行。显然,你是在之前的版本中创建了你的用户。 - Gunnar Hjalmarsson~/.profile
仍然有这个设置,但你是对的 - 在我升级的16.04系统上,/etc/skel/.profile
没有这个设置(在另一台机器上安装16.04时创建的用户帐户的.profile
也没有它)。 - Eliah Kagan.profile
或.bashrc
,例如https://stackoverflow.com/a/18665363/516748。 - KCD/etc/environment
吗?它似乎就是为这个任务而设计的... - MarcPATH
)被分配的顺序。我也会涵盖你通常应该设置它们的位置,但下面的列表并不按照你应该考虑使用它们的顺序列出。关于在Ubuntu中设置PATH
和其他环境变量的一般信息,我还建议阅读EnvironmentVariables以及本问题的其他答案。PATH
的首选位置取决于你需要为哪些用户设置以及何时以及如何设置它。你的决策的一部分将是你是否想要设置一个适用于所有用户的环境变量,还是仅适用于每个用户。如果你不确定,我建议只为一个用户(例如你自己的账户)设置它,而不是系统范围内设置。
正如AlexP所说,PATH
环境变量将具有最近分配的值。实际上,大多数情况下,当您设置PATH
时,您会在新值中包含PATH
的旧值,以便保留先前的条目。
因此,在实践中,当从多个文件设置PATH
时,通常包含所有文件中给定的条目。但这仅发生在所有设置它的文件(除第一个文件外)通常引用PATH
变量本身,从而导致其旧值被包含在新值中。
因此,您实际上正在请求各个文件中PATH
设置产生效果的顺序。
通常,设置PATH
的常见通用位置如下所示,按照用户登录时生效的顺序列出,而不是你通常应该考虑使用它们的顺序。下面列出的每个位置都是在某些情况下设置PATH
的合理选择,但只有少数几个是大多数时间内的好选择。
在下面的列表中,你会看到一些目录名,比如~/.profile
。如果你对波浪线扩展不熟悉,~/
指的是当前用户的主目录。我主要使用这种语法是为了紧凑性。它在shell脚本中受支持,但在PAM配置文件中不受支持。
/etc/environment
PAM在Ubuntu上会导致环境变量被设置,如果存在/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/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
中的值,即使该值被指定为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
别这样做!
我不小心测试了一下,结果导致任何用户都无法成功登录。为了修复这个问题,我不得不进入恢复模式并将其改回来。(幸运的是,我在一个仅用于测试的虚拟机上进行了这个操作,所以没有给我带来任何麻烦。)
.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
ubuntu-devel
讨论。bash
)在作为登录shell调用时会运行/etc/profile
中的命令。/etc/profile
以此结束: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
是一个shell脚本,其语法与上述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
,bash将使用它而不是~/.profile
(见下文),除非存在~/.bash_profile
,在这种情况下,除非从`~/.bash_login源化,否则不会使用其他任何文件。
与.bash_profile
一样,您通常不应该在您的主目录中拥有.bash_login
文件。
.profile
。/etc/profile
中的命令(通常包括导致在/etc/profile.d/
文件中的命令被运行的命令--请参见上文)。之后,它会运行用户主目录下.profile
中的命令。这个文件对每个用户都是独立的。(如果存在的话,Bash实际上会运行.bash_profile
或.bash_login
--但是,在Ubuntu系统上,这些文件很少存在或者根本不存在。有关详细信息,请参见上文和6.2 Bash Startup Files in Bash手册。)~/.profile
是用户在登录时放置命令的主要位置。这是您设置PATH
的传统位置,但由于Ubuntu具有pam_env模块并支持~/.pam_environment
,您应该考虑使用它。# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
bin
的子目录。如果有,它会将该子目录添加到你的 PATH
变量的开头位置。
该列表并未包含所有可能性。
当用户登录时,环境变量的设置方式还与登录类型有关。例如,你可能会偶尔遇到仅用于图形界面登录或基于SSH的远程登录的环境变量。以上列表并不涵盖这些情况。/etc/environment
/~/.pam_environment
是唯一推荐的文件。在与开发人员咨询过之后,我将其改为在 PAM 和 /etc/profile.d/*.sh
/~/.profile
之间保持中立,并且我仍然倾向于这样看待它。 - Gunnar Hjalmarsson/etc/profile.d/*.sh
和~/.profile
的重要论点是语法更简单,并且lightdm/gdm在出现错误时也比较宽容(即使有语法错误,也不会阻止你登录,只会显示警告信息)。 - Gunnar Hjalmarssonpam_env.so
是指 pam_env.conf
吗? - Johan Boulépam_env.conf
。谢谢!我已经编辑好了。 - Eliah Kagan/etc/profile.d
结尾是否应该改为"Ubuntu的/etc/profile
结尾?" - DK Bose/etc/environment文件不是一个脚本文件,你不能在那里使用export命令,也不支持类似$HOME的变量扩展,只能使用简单的变量=值对。所以要使用该文件,你只需要将你的路径追加到现有定义中,它专门用于系统范围的环境变量设置,每行一个。具体来说,该文件存储了系统范围的区域设置和路径设置。
~/.profile - 每当执行bash shell时,都会执行此文件,通常推荐用于环境变量设置,但它的缺点是只有登录shell才会调用它,因此为了使其生效,你需要注销并重新登录,或者至少启动一个新的登录shell。
~/.profile
和/etc/environment
与其他位置的关系的因素,请点击这里和这里。这些因素将影响您如何使用这些位置。https://help.ubuntu.com/community/EnvironmentVariables#A.2Fetc.2Fprofile.d.2F.2A.sh