书中写道:
在 POSIX 兼容模式下,狂欢 将会效仿什。
这是什么意思?用通俗易懂的术语来说,模拟是什么意思?
答案1
这不是 Linux 的东西,而是 bash 的东西。Bash 只是众多 shell 中的一个。Bash 是“Bourne again shell”,是作为原始 Bourne Shell 的替代品发布的sh
。
POSIX 是一套标准,定义符合 POSIX 的系统应如何工作。POSIX shell 标准可以在以下位置找到:这里。Bash 具有许多不存在的功能sh
,并且实际上不是一个符合 POSIX 标准的 shell。
这就是--posix
提供该选项的原因。正如man bash
(重点是我的)中解释的那样:
如果使用名称 sh 调用 bash,它会尝试尽可能地模仿 sh 的历史版本的启动行为,同时符合 POSIX 标准。当作为交互式登录 shell 或使用 --login 选项的非交互式 shell 调用时,它首先尝试按顺序从 /etc/profile 和 ~/.profile 读取和执行命令。可以使用 --noprofile 选项来禁止此行为。 当以名为 sh 的交互式 shell 形式调用时,bash 会查找变量 ENV,如果已定义则扩展其值,并使用扩展的值作为要读取和执行的文件的名称。由于以 sh 形式调用的 shell 不会尝试从任何其他启动文件中读取和执行命令,因此 --rcfile 选项不起作用. 使用名称 sh 调用的非交互式 shell 不会尝试读取任何其他启动文件。当以 sh 调用时,bash 在读取启动文件后进入 posix 模式。
当 bash 以 posix 模式启动时,与使用 --posix 命令行选项一样,它遵循启动文件的 POSIX 标准。在此模式下,交互式 shell 会扩展 ENV 变量,并从以扩展值命名的文件中读取和执行命令。不会读取其他启动文件。
这意味着如果您运行sh
或bash --posix
来启动交互式 shell,您的~/.bahsrc
文件将被忽略,而是$ENV
读取另存为的文件(如果有)。为了说明这一点,我已将以下内容添加echo "read .bashrc"
到我的~/.bashrc
:
$ bash
read .bashrc ## message was printed, ~/.bashrc was read
$ sh
sh-4.3$ ## no message printed, ~/.bashrc was not read
如果我现在设置$ENV
:
$ export ENV="~/.bashrc"
$ sh
read .bashrc
重要的提示:Ubuntu 选择建立/bin/sh
指向 的符号链接/bin/dash
。Dash 是另一个 shell,实际上是一个符合 POSIX 标准的 shell。这意味着,为了观察我上面描述的行为,您需要使用不同的sh
1。在 Ubuntu 上,您需要创建一个名为 的文件sh
,它是指向 的符号链接/bin/bash
:
$ ln -s /bin/bash ~/sh
现在,您的主目录中有一个名为的文件sh
。使用它来演示我上面解释的差异:
$ ls -l ~/sh
lrwxrwxrwx 1 terdon terdon 9 May 2 14:03 /home/terdon/sh -> /bin/bash
$ ~/sh
read .bashrc
1 实际上,该行为看起来好像是相同的,~/.bashrc
将被忽略,但那只是因为dash
它不是bash
,并且无论如何都与读取 bash 特定无关~/.bashrc
。但是,dash
也会被忽略$ENV
,因此您需要使用链接来/bin/bash
查看。