我很困惑 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
。
现在,存在许多文件的原因之一login
与non-login
shell 的概念密切相关。看这里一个很好的总结。以下内容来自 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
...