我知道环境变量是通过读取或执行几个配置文件来设置的,例如/etc/environment
,,,,等等。/etc/profile
~/.profile
~/.bashrc
但当我读书的时候这篇博文,我尝试使用以下命令在不导入环境的情况下启动非登录交互式 bash shell:
osboxes@osboxes:~$ env -i bash
进入新的 shell 后,我检查了PATH
变量,得到以下结果:
osboxes@osboxes:/home/osboxes$ echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
据我所知,这个非登录交互式 shell 不会读取/etc/environment
或获取/etc/profile
或~/.profile
;它只有来源/etc/bash.bashrc
和~/.bashrc
。
PATH
那么这个shell中的变量是如何设置的呢?是否有特定的文件可供读取或来源?
答案1
检查printenv
PATH 是否没有值。如果您发现某些东西,它可能来自您的~/.bashrc
.如果它为空,则它是由 Bash 本身设置的。当 shell 启动时,如果它找不到 PATH 的值,它将设置一个值,因为没有 PATH,几乎没有什么可以工作。
你可以在源代码中看到这是如何完成的(我正在查看 Bash 4.4 的源代码):
/* Now make our own defaults in case the vars that we think are
important are missing. */
temp_var = set_if_not ("PATH", DEFAULT_PATH_VALUE);
#if 0
set_auto_export (temp_var); /* XXX */
#endif
在config-top.h
您可以找到定义(与您显示的 PATH 匹配):
/* The default value of the PATH variable. */
#ifndef DEFAULT_PATH_VALUE
#define DEFAULT_PATH_VALUE \
"/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
#endif
我相信放入 PATH 通常被认为是不好的做法,.
因为它很容易意外执行事情!
答案2
PATH
正如 Bourne Again shell 的手册所解释的,如果没有PATH
环境变量来初始化 shell 变量并且启动脚本中未设置 shell 变量,则 shell变量有一个默认值。
根据手册,该值取决于“安装的系统管理员bash
”。事实上,这取决于从源代码编译 Bourne Again shell 的人选择了哪些选项。
- 在 Debian 的 Bourne Again shell 包中,它接近手册中的默认示例:
% unsetenv PATH `命令 -v bash` -c 'echo $PATH ; printenv 路径' /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:。 %
- 在 Bourne Again shell 的 OpenBSD 端口/包中,它是相同的:
$ unsetenv PATH `命令 -v bash` -c 'echo $PATH ; printenv 路径' /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:。 $
- 在 Bourne Again shell 的 FreeBSD 移植/包中,它有些损坏:
% unsetenv PATH `命令 -v bash` -c 'echo $PATH ; printenv 路径' /sbin:/bin:/usr/sbin:/usr/bin:/usr/games:%%LOCALBASE%%/sbin:%%LOCALBASE%%/bin %
2017 年 3 月,我们通过调整用于构建软件的编译器选项进行了调整。
printenv
不打印一行的事实告诉您,这个默认的PATH
shell 变量没有顺便导出到环境变量中。