当我使用 env -i bash 启动 Bash shell 时,PATH 变量设置在哪里?

当我使用 env -i bash 启动 Bash shell 时,PATH 变量设置在哪里?

我知道环境变量是通过读取或执行几个配置文件来设置的,例如/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

检查printenvPATH 是否没有值。如果您发现某些东西,它可能来自您的~/.bashrc.如果它为空,则它是由 Bash 本身设置的。当 shell 启动时,如果它找不到 PATH 的值,它将设置一个值,因为没有 PATH,几乎没有什么可以工作。

你可以在源代码中看到这是如何完成的(我正在查看 Bash 4.4 的源代码):

variables.c:

  /* 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不打印一行的事实告诉您,这个默认的PATHshell 变量没有顺便导出到环境变量中。

相关内容