只是出于好奇,有什么方法可以从回显诸如$PATH
,之类的变量的位置找到该文件吗?$CDPATH
第二个问题:
另外 bash 如何知道这些变量?是吗env
?如果是这样,这是一个文件吗?可以添加这样新的自定义变量吗?
答案1
第一个问题回答: $PATH 变量在登录时根据文件数量构建,您看到的输出echo $PATH
是合并结果的结果(保存在内存中)。
要查找在哪个文件中设置 PATH 变量(可能会在多个文件中),您必须考虑登录时读取的文件。下面的列表可能因发行版而异,但应该是一个很好的起点。
/etc/profile, /etc/profile.d/*, /etc/bashrc, /etc/environment, ~/.bashrc, ~/.bash_profile, ~/.bash_login, ~/.profile.
第二题答案如上所述,变量保存在内存中,您可以根据需要修改和添加新变量。例如添加到已定义的 PATH:
[root@re ~]# PATH=$PATH:/opt/some/path
[root@re ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/some/path
以上仅对当前会话有效。为了使其永久化,我需要将其添加到登录期间获取的文件之一。
假设我想添加 JAVA_HOME 并确保 java 二进制文件位于系统路径变量中。我将使用以下内容创建名为 /etc/profile.d/my-java-env.sh 的新文件。
[root@re ~]# cat /etc/profile.d/my-java-env.sh
# Here we are adding java bin folder to existing path.
PATH=$PATH:/usr/java/jdk1.8.0_20/bin
# Here we are creating new variable pointing to JAVA_HOME
JAVA_HOME=/usr/java/jdk1.8.0_20
为使以上内容重新登录生效。
$CDPATH默认情况下,在我使用的发行版(Ubuntu、CentOS)上,变量为空(未设置),但相同的逻辑适用,如果设置了,那么这可能是在登录期间获取的文件之一中完成的(如上所述) 。