pkaramol Asked: 2016-12-31 05:45:05 +0800 CST2016-12-31 05:45:05 +0800 CST 2016-12-31 05:45:05 +0800 CST 在 /etc/environment 与 .profile 中设置 PATH 变量 772 设置环境变量的首选位置在哪里PATH? ~/.profile还是/etc/environment? PATH两个地方都设置了是什么情况?最终结果是在这两个地方设置的两个值的串联吗? environment-variables 6 个回答 Voted Best Answer Byte Commander 2016-12-31T06:10:04+08:002016-12-31T06:10:04+08:00 概括: 如果您只想为当前用户而不是为您计算机的所有用户添加路径(例如/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 作为第一个配置文件之一读取。请注意,它不是 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 您会看到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,您应该确保您没有,~/.bash_profile或者~/.bash_login如果您希望更改~/.profile对您的用户产生影响。 要全面了解环境变量,请参阅: https ://help.ubuntu.com/community/EnvironmentVariables 相关问题:bash.bashrc 和 /etc/environment 文件之间的区别 Eliah Kagan 2016-12-31T10:30:31+08:002016-12-31T10:30:31+08:00 这个答案主要是关于在不同配置文件中指定时分配环境变量的顺序。PATH我还介绍了您通常应该在哪里设置它们,但是下面的列表没有按照您应该考虑使用它们的顺序列出文件。有关PATH在 Ubuntu 中设置和其他环境变量的一般信息,我还建议阅读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/enviromnment、sudo nano -w /etc/environment、gksudo gedit /etc/environment等) /etc/environment不支持自动包含变量的旧值。但这通常是不必要的,因为大多数时候您会通过编辑为所有用户设置一个环境变量,无论如何/etc/environment您都希望它是用户登录时的初始值。然后,用户可以随意更改它。通常,用户能够做到这一点是件好事。 2. 对于所有用户:/etc/security/pam_env.conf PAM 从 读取所有用户的环境变量/etc/security/pam_env.conf,使用与每个用户文件中使用的相同语法指定~/.pam_environment(见下文)。 当在/etc/environmentand中设置相同的环境变量时,将使用/etc/security/pam_env.confin 的值pam_env.conf——即使该值被指定为DEFAULT而不是OVERRIDE。 但是,当您用 in 取代 line inenvironment时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 不要这样做! 我只是偶然测试了自己,它阻止了任何用户成功登录。要修复它,我必须以恢复模式启动并将其改回。(幸运的是,我是在仅用于测试的虚拟机上执行此操作的,因此并没有给我带来任何麻烦。) 3.对于一个用户:.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 请参阅EnvironmentVariables的~/.pam_environment小节(上面的示例非常接近),以及更多详细信息。man pam_envman pam_env.conf 尽管这曾经被吹捧为 Ubuntu 用户更改或添加环境变量的首选方式,并且仍然被认为是合理且可接受的选择,但在编辑.pam_environment. 就像对系统范围的编辑/etc/security/pam_env.conf(见上文)一样,用户.pam_environment文件中的格式错误的行将阻止登录成功。(我已经对此进行了测试——这次是故意的。)有关建议如何演变的信息,请参阅下面的Gunnar Hjalmarsson的评论 和此讨论。ubuntu-devel 一般来说,这样的错误比 中的格式错误的行要严重得多pam_env.conf,因为它只影响一个用户。但是,对于只有一个允许登录的用户帐户的桌面 Ubuntu 系统,编辑.pam_environment时出现这样的错误与编辑错误一样糟糕pam_env.conf——如果你还没有登录,你将无法登录在不以恢复模式(或从活动 USB 等)启动的情况下修复它。 (如果您确实有其他用户帐户,那么您可以以其他用户身份登录并解决问题。即使他们不是管理员并且无法sudoroot,他们仍然可以运行并被提示输入您的(不是他们的)密码.但是,来宾帐户不能这样做,因为禁止使用它来冒充另一个用户的身份。)su your-accountsu 4.对于所有用户:/etc/profile和里面的文件/etc/profile.d/ Bourne 兼容的 shell(包括bashUbuntu 中的默认用户 shell)在/etc/profile作为登录 shell 调用时运行命令。 Ubuntu 的/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/替代的主要情况。 5.对于一个用户:.bash_profile在用户的主目录中 如果用户有~/.bash_profile,bash 使用它而不是~/.profileor ~/.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 运行时,它会运行 in 中的命令/etc/profile(通常包括导致/etc/profile.d/运行 files in 中的命令的命令——见上文)。之后,它.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_environmentPATH.profilePATH.pam_environmentPATH 例如,.profileUbuntu 上的默认每个用户文件过去常常以: # 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 的远程登录的环境变量。上面的列表不包括此类情况。 我遗漏了一些人们有时会定义环境变量的文件,例如~/.bashrcand /etc/bash.bashrc,因为通常不建议设置PATH它们,而且您很少将它们实际用于此目的。如果你使用这些文件来添加目录PATH,那么它们有时会被添加很多次,当你检查时会很混乱$PATH。(在极端情况下,这可能会减慢速度,但通常只是保持一切清洁和易于理解的问题。) 由于bashUbuntu 是用户的默认登录 shell,并且大多数用户使用它或其他与 POSIX 兼容的 shell,因此我省略了有关如何在其他非 Bourne 样式的 shell 中设置环境变量的信息,例如tcsh. eGhoul 2016-12-31T06:07:22+08:002016-12-31T06:07:22+08:00 /etc/environment文件不是您不能在此处使用 export 的脚本文件,它不支持 $HOME 类型的变量扩展,仅支持 simplevariable=value 对。因此,要使用该文件,您只需将路径附加到现有定义,专门用于系统范围的环境变量设置。每行一个。具体来说,此文件存储系统范围的区域设置和路径设置。 ~/.profile - 每当执行 bash shell 时都会执行此文件,通常是环境变量的推荐文件,但它的缺点是只能由登录 shell 调用,因此为了使其生效,您需要注销并重新登录 - 或者至少,启动一个新的登录 shell。 George Udosen 2016-12-31T06:10:03+08:002016-12-31T06:10:03+08:00 设置环境变量的首选位置取决于几件事: 你是唯一一个使用电脑的人吗: 在这种情况下,设置它的最佳位置是在,/etc/environment因为没有 _unauthorized 访问的危险。 如果系统被很多人使用 如果变量应该被所有人访问,那么位置将是/etc/environment,但是 如果单个用户应该选择对他们的访问权限,那么每个用户都应该将他们的~/.profile权限设置为与系统的每个用户相关的权限,因为它位于每个用户的主目录中。 系统会/etc/environment先读再读~/.profile。没有连接发生,就像Alex P所说的最后一次分配路径占上风。 要更详细地了解决定其他此类地点的方式~/.profile和/etc/environment发挥作用的因素,请点击此处和此处,因为这些因素将影响您使用这些地点的方式。 Good Pen 2021-12-18T06:21:48+08:002021-12-18T06:21:48+08:00 bash 会读取这些文件,但 zsh 不会: 全系统 /etc/profile- 直接编辑它不是一个好主意。 /etc/profile.d/*.sh- 来源/etc/profile 会话范围 ~/.profile https://help.ubuntu.com/community/EnvironmentVariables#A.2Fetc.2Fprofile.d.2F.2A.sh Ashutosh 2020-04-03T06:28:17+08:002020-04-03T06:28:17+08:00 检查你的/etc/environment文件。它应该只包含文字路径,即它不应该包含类似“ $PATH=$PATH:<any_path_you_want_to_add>”的东西。 这将导致您的系统出错并让您陷入登录循环。
概括:
如果您只想为当前用户而不是为您计算机的所有用户添加路径(例如
/your/additional/path
)到变量,通常在这两个示例之一中将其放在类似的末尾:PATH
~/.profile
请注意,路径优先级从左到右递减,因此第一条路径具有最高优先级。如果您在 的左侧添加路径
$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
系统上所有用户的变量设置为此默认值,不应以主要方式更改。至少您不应该从中删除任何重要的路径,例如/bin
,和。/sbin
/usr/bin
/usr/sbin
这个文件被每个用户的每个 shell 作为第一个配置文件之一读取。请注意,它不是 shell 脚本。它只是一个以某种方式解析的配置文件,可能只包含环境变量分配!
该
~/.profile
文件可以包含许多内容,默认情况下,它包含检查~/bin
目录是否存在并将其添加到用户现有PATH
变量中的内容,如下所示(在 16.04 之前的旧 Ubuntu 版本上 - 无条件添加它 - 和 18.04 ,它还添加了“~/.local/bin”):您会看到
PATH
这里重用了旧值,并且新路径仅附加到开头而不是覆盖所有内容。当您手动想要添加新路径时,您还应该始终将旧$PATH
值保留在新字符串中的某个位置。这个初始化脚本只能被它所属的用户的 shell 读取,但还有另一个条件:
因此,如果您使用默认的 Bash shell,您应该确保您没有,
~/.bash_profile
或者~/.bash_login
如果您希望更改~/.profile
对您的用户产生影响。要全面了解环境变量,请参阅: https ://help.ubuntu.com/community/EnvironmentVariables
相关问题:bash.bashrc 和 /etc/environment 文件之间的区别
设置的首选位置
PATH
取决于您需要为哪些用户设置以及何时以及如何设置。您的部分决定将是您是否希望为所有用户或每个用户设置环境变量。如果您不确定,那么我建议您仅为一个用户(例如,您的帐户)而不是系统范围设置它。正如AlexP 所说,
PATH
环境变量将具有它最近分配的值。在实践中,大多数时候您设置PATH
,您将旧值 包含PATH
在新值中,以便保留以前的条目。因此,在实践中,当
PATH
从多个文件中设置时,它通常包含所有文件中给出的条目。但这只是因为所有设置它的文件,除了第一个文件,通常都引用PATH
变量本身,导致它的旧值包含在新值中。因此,您实际上是在询问
PATH
各种文件中的设置生效的顺序。PATH
下面按用户登录时它们生效的顺序列出了常见的通用设置位置,而不是您通常应该考虑使用它们的顺序。下面列出的每个地方都是PATH
在某些情况下设置的合理选择,但大多数时候只有少数几个是不错的选择。在下面的列表中,您会看到一些目录名称,例如
~/.profile
. 如果您不熟悉波浪号扩展,~/
请参考当前用户的主目录。我主要使用这种语法来实现紧凑性。它在 shell 脚本中受支持,但在PAM 配置文件中不受支持。1. 对于所有用户:
/etc/environment
Ubuntu 上的PAM会导致设置列出的环境变量
/etc/environment
(如果该文件存在),默认情况下会设置。这就是所有用户的环境变量最常见的设置方式。如果您必须为所有用户帐户设置环境变量,而不仅仅是您的用户帐户,那么修改该文件可能是您的最佳选择。我建议先备份它。备份此文件的一种方法是运行:
.orig
扩展名不是特别需要 - 您可以将备份文件命名为任何不混淆或已被使用的名称。(除了.orig
,.old
和是常见的。.backup
).bak
您可以以任何可能以 root 用户身份编辑任何其他文件的方式编辑此文件(
sudoedit /etc/enviromnment
、sudo nano -w /etc/environment
、gksudo gedit /etc/environment
等)/etc/environment
不支持自动包含变量的旧值。但这通常是不必要的,因为大多数时候您会通过编辑为所有用户设置一个环境变量,无论如何/etc/environment
您都希望它是用户登录时的初始值。然后,用户可以随意更改它。通常,用户能够做到这一点是件好事。2. 对于所有用户:
/etc/security/pam_env.conf
PAM 从 读取所有用户的环境变量
/etc/security/pam_env.conf
,使用与每个用户文件中使用的相同语法指定~/.pam_environment
(见下文)。当在
/etc/environment
and中设置相同的环境变量时,将使用/etc/security/pam_env.conf
in 的值pam_env.conf
——即使该值被指定为DEFAULT
而不是OVERRIDE
。但是,当您用 in 取代 line in
environment
时pam_env.conf
,您可以包含被取代值的内容。有关详细信息,请参阅下面的部分.pam_environment
(因为它使用相同的语法)。通常不需要编辑
pam_env.conf
,如果你这样做了,你应该非常小心,因为格式错误的行通常会阻止所有普通用户帐户登录!例如,默认pam_env.conf
包含以下行:这是几个例子之一。它说明的一件事是如何使用
\
. 假设您只取消注释第一行,但忘记取消注释第二行:不要这样做!
我只是偶然测试了自己,它阻止了任何用户成功登录。要修复它,我必须以恢复模式启动并将其改回。(幸运的是,我是在仅用于测试的虚拟机上执行此操作的,因此并没有给我带来任何麻烦。)
3.对于一个用户:
.pam_environment
在用户的主目录中为单个用户设置环境变量的方法之一是让该用户
.pam_environment
在其主目录中编辑(或创建)。此文件中设置的值取代全局/etc/environment
文件中设置的值。.pam_environment
不是最初创建用户帐户时复制到用户主文件夹中的文件框架的一部分。但是,如果您在主目录中创建该文件,则可以使用它来设置环境变量,例如PATH
. 与/etc/environment
(但喜欢/etc/security/pam_env.conf
)不同,每个用户的.pam_environment
文件确实支持将环境变量的旧值扩展为新值。但是,它们不是 shell 脚本,您必须使用特殊语法来实现这一点,这与您在.profile
.例如,如果您的
bin2
主目录中有一个目录要添加到 的末尾PATH
,您可以通过将此行添加到 来做到这一点.pam_environment
:请参阅EnvironmentVariables的
~/.pam_environment
小节(上面的示例非常接近),以及更多详细信息。man pam_env
man pam_env.conf
尽管这曾经被吹捧为 Ubuntu 用户更改或添加环境变量的首选方式,并且仍然被认为是合理且可接受的选择,但在编辑
.pam_environment
. 就像对系统范围的编辑/etc/security/pam_env.conf
(见上文)一样,用户.pam_environment
文件中的格式错误的行将阻止登录成功。(我已经对此进行了测试——这次是故意的。)有关建议如何演变的信息,请参阅下面的Gunnar Hjalmarsson的评论 和此讨论。ubuntu-devel
一般来说,这样的错误比 中的格式错误的行要严重得多
pam_env.conf
,因为它只影响一个用户。但是,对于只有一个允许登录的用户帐户的桌面 Ubuntu 系统,编辑.pam_environment
时出现这样的错误与编辑错误一样糟糕pam_env.conf
——如果你还没有登录,你将无法登录在不以恢复模式(或从活动 USB 等)启动的情况下修复它。(如果您确实有其他用户帐户,那么您可以以其他用户身份登录并解决问题。即使他们不是管理员并且无法
sudo
root,他们仍然可以运行并被提示输入您的(不是他们的)密码.但是,来宾帐户不能这样做,因为禁止使用它来冒充另一个用户的身份。)su your-account
su
4.对于所有用户:
/etc/profile
和里面的文件/etc/profile.d/
Bourne 兼容的 shell(包括
bash
Ubuntu 中的默认用户 shell)在/etc/profile
作为登录 shell 调用时运行命令。Ubuntu 的
/etc/profile
结尾是:这会导致
/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/
替代的主要情况。5.对于一个用户:
.bash_profile
在用户的主目录中如果用户有
~/.bash_profile
,bash 使用它而不是~/.profile
or~/.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 运行时,它会运行 in 中的命令
/etc/profile
(通常包括导致/etc/profile.d/
运行 files in 中的命令的命令——见上文)。之后,它.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 上的默认每个用户文件过去常常以:有关详细信息,请参阅Gunnar Hjalmarsson对Byte Commander 答案的评论。
这将检查您是否有
bin
主目录的子目录。如果是这样,它会将该子目录添加到您的PATH
.该列表省略了一些可能性。
当用户登录时,还有其他方式设置环境变量,这在很大程度上取决于登录类型。例如,您可能偶尔会设置仅用于图形登录或仅用于基于 SSH 的远程登录的环境变量。上面的列表不包括此类情况。
我遗漏了一些人们有时会定义环境变量的文件,例如
~/.bashrc
and/etc/bash.bashrc
,因为通常不建议设置PATH
它们,而且您很少将它们实际用于此目的。如果你使用这些文件来添加目录PATH
,那么它们有时会被添加很多次,当你检查时会很混乱$PATH
。(在极端情况下,这可能会减慢速度,但通常只是保持一切清洁和易于理解的问题。)由于
bash
Ubuntu 是用户的默认登录 shell,并且大多数用户使用它或其他与 POSIX 兼容的 shell,因此我省略了有关如何在其他非 Bourne 样式的 shell 中设置环境变量的信息,例如tcsh
./etc/environment文件不是您不能在此处使用 export 的脚本文件,它不支持 $HOME 类型的变量扩展,仅支持 simplevariable=value 对。因此,要使用该文件,您只需将路径附加到现有定义,专门用于系统范围的环境变量设置。每行一个。具体来说,此文件存储系统范围的区域设置和路径设置。
~/.profile - 每当执行 bash shell 时都会执行此文件,通常是环境变量的推荐文件,但它的缺点是只能由登录 shell 调用,因此为了使其生效,您需要注销并重新登录 - 或者至少,启动一个新的登录 shell。
设置环境变量的首选位置取决于几件事:
/etc/environment
因为没有 _unauthorized 访问的危险。/etc/environment
,但是~/.profile
权限设置为与系统的每个用户相关的权限,因为它位于每个用户的主目录中。系统会
/etc/environment
先读再读~/.profile
。没有连接发生,就像Alex P所说的最后一次分配路径占上风。要更详细地了解决定其他此类地点的方式
~/.profile
和/etc/environment
发挥作用的因素,请点击此处和此处,因为这些因素将影响您使用这些地点的方式。bash 会读取这些文件,但 zsh 不会:
全系统
/etc/profile
- 直接编辑它不是一个好主意。/etc/profile.d/*.sh
- 来源/etc/profile
会话范围
~/.profile
https://help.ubuntu.com/community/EnvironmentVariables#A.2Fetc.2Fprofile.d.2F.2A.sh
检查你的
/etc/environment
文件。它应该只包含文字路径,即它不应该包含类似“$PATH=$PATH:<any_path_you_want_to_add>
”的东西。这将导致您的系统出错并让您陷入登录循环。