这本书说:
在POSIX兼容模式下,bash将模拟sh。
这是什么意思?用简单的外行术语进行仿真意味着什么?
这不是Linux,而是bash。Bash只是众多shell中的一种。Bash是“ Bourne Again Shell”,并作为原始Bourne Shell的替代产品发布sh
。
POSIX是一组定义POSIX兼容系统应如何工作的标准。POSIX shell标准可以在这里找到。Bash具有许多不存在的功能,sh
并且实际上不是POSIX兼容的外壳。
这--posix
就是提供该选项的原因。如man bash
(重点我的)中所述:
如果使用名称sh调用bash,则它会尝试尽可能接近于sh的历史版本的启动行为,同时也要符合POSIX标准。当作为交互式登录外壳程序或带有--login选项的非交互式外壳程序调用时,它首先尝试按该顺序从/ etc / profile和〜/ .profile中读取和执行命令。--noprofile选项可用于禁止此行为。当bash作为名称为sh的交互式shell调用时,bash查找变量ENV,如果定义了变量,则扩展其值,并将扩展后的值用作要读取和执行的文件的名称。由于以sh调用的shell不会尝试从任何其他启动文件读取和执行命令,因此--rcfile选项无效。。使用名称sh调用的非交互式外壳程序不会尝试读取任何其他启动文件。当作为sh调用时,bash在读取启动文件后进入posix模式。
当bash在posix模式下启动时(与--posix命令行选项一样),它遵循POSIX标准来启动文件。在这种模式下,交互式外壳程序将扩展ENV变量,并从名称为扩展值的文件中读取并执行命令。没有其他启动文件被读取。
这意味着,如果运行sh
或bash --posix
来启动交互式外壳~/.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是另一种外壳,实际上是与POSIX兼容的外壳。这意味着为了观察我上面描述的行为,您需要使用不同的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
来查看。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句