Linux 中的 POSIX 兼容模式是什么?

Linux 中的 POSIX 兼容模式是什么?

书中写道:

在 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 变量,并从以扩展值命名的文件中读取和执行命令。不会读取其他启动文件。

这意味着如果您运行shbash --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。这意味着,为了观察我上面描述的行为,您需要使用不同的sh1。在 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查看。

相关内容