Linux 中的路径环境变量如何工作?

Linux 中的路径环境变量如何工作?

我很困惑 PATH 环境变量在 Linux 下如何工作。我是 Linux Mint 15 用户。

首先,我阅读了有关编辑/home/.bashrc文件和执行 a 的内容PATH=$PATH:/directory
但我也了解了一些管理的路径内容/etc/bash.bashrc
,因此/usr/local/bin可以从 shell 中的任何位置访问安装在其中的任何软件。

路径变量在Linux下如何工作以及应该放在哪里?

答案1

这里要掌握的基本概念是 PATH 可以在很多地方定义。正如@demure 在他的回答中解释的那样,PATH=$PATH:/new/dir意味着添加 /new_dir到了$PATH,原来就不清楚了$PATH

现在,存在许多文件的原因之一loginnon-loginshell 的概念密切相关。看这里一个很好的总结。以下内容来自 bash 手册页(重点是我的):

当 bash 作为交互式登录 shell 或带有 --login 选项的非交互式 shell 被调用时,它首先从文件 /etc/profile 中读取并执行命令(如果该文件存在)。读取该文件后,它会按顺序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,并从第一个存在且可读的命令中读取并执行命令。启动 shell 时可以使用 --noprofile 选项来禁止此行为。

当您第一次登录系统时,您会启动登录shell 因此 bash 将读取上面列出的文件。大多数发行版都设置了系统范围$PATH(适用于所有用户),/etc/profile您应该在此处进行任何想要应用于所有用户的更改。这是我的 Debian 上的:

PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"

登录后,当您打开终端时,您会启动交互式、非登录壳。这是man bash关于这些的不得不说的:

   When  an  interactive shell that is not a login shell
   is started, bash reads  and  executes  commands  from
   /etc/bash.bashrc and ~/.bashrc, if these files exist.

因此,每次打开新终端时都会读取这些文件。最终的 $PATH 是所有文件中的值的组合。在典型情况下,您使用图形登录管理器登录并启动新会话。此时,您的内容$PATH就是各个profile文件中定义的内容。如果您打开终端,那么您将处于交互式 shell 中,并且bashrc会读取不同的文件,这些文件可能会将内容附加到$PATH.


总而言之,您真正需要知道的是您可以$PATH通过编辑$HOME/.profile.

答案2

在你的主目录中,它会是.bashrc,而不是.bash.rc
系统范围的配置/etc/bashrc不是/etc/.bash.rc

Unix和Linux不使用\some\path\here文件路径,它们使用/some/path/here文件路径。\是转义字符,用于禁用其他特殊字符。

您可以$PATH通过将这些添加到您的~/.bashrc~表示您的主目录)行来编辑您的

PATH=$PATH:/usr/local/bin:/some/other/path
export PATH

在哪里

  • $PATH保留已设置为 PATH 的所有内容。
  • :分隔条目。
  • 这两个目录是示例(您不需要该:/some/other/path部分)

/etc/bashrc如果您只需要自己进行更改,我不建议在整个系统范围内进行编辑。

答案3

首先,内核(或 initramfs)将为进程提供一个初始默认 PATH 值init,以及一些其他环境变量。如果需要,您可以查看它们:

$ sudo strings /proc/1/environ
selinux=0
SHLVL=1
HOME=/
init=/sbin/init
TERM=linux
drop_caps=
BOOT_IMAGE=/vmlinuz-4.9.80-atom
PATH=/sbin:/usr/sbin:/bin:/usr/bin
crashkernel=384M-:128M
PWD=/
rootmnt=/root

对于在启动时启动的守护进程和其他进程,该init进程(无论是传统的 SysVinit 还是新的替代品之一,例如systemd)可能会应用其自己的默认 PATH,或者仅传递内核默认值。这可能是也可能不是可配置的:请参阅 init 系统的文档。

对于登录会话,PAM 设置可能包括pam_env.so可以为用户会话强制执行默认路径的内容,可在/etc/security/pam_env.conf.或者,如果pam_env.so不使用 ,则处理登录的进程(例如,或控制台或串行端口登录上的sshd传统*getty+对)可能会为用户会话强制执行其自己的默认启动路径。login

然后,用户的 shell 通常会执行一个或多个系统范围的登录脚本,以及一个或多个用户特定的登录脚本(如果存在)。其中任何一个都可以添加到现有的 PATH 设置或完全替换它。

答案4

对于PATH我使用/etc/enviroment/etc/login.defs

...

相关内容