为什么bash有两套不同的选项?

时间:2017-06-29 20:03:56

标签: bash

Bash似乎将其选项集分为两种类型。我有兴趣了解其原因。

澄清一下,如果我运行shopt命令,我会得到一个选项及其状态列表(开/关),但如果我运行shopt -o,我会得到一个不同的选项列表。甚至shopthelp shopt)的文档似乎也有这样的区别:

  -o    restrict OPTNAMEs to those defined for use with `set -o'

换句话说,可以使用set -o设置选项,但只能使用shopt命令设置选项。为什么bash包含两组不同的选项?为什么不简单地使用shopt命令设置所有选项?

1 个答案:

答案 0 :(得分:4)

因为bash是一个“厨房水槽”外壳。 set -o选项用于所有基于Bourne的shell。 set -o vi在ksh中做同样的事情,就像在bash中做的那样,例如。

在那之后,有人认为bash需要更多不兼容bourne的选项,因此shopt诞生了。有些是好的,有些是奇怪的。

另外,如果这看起来很奇怪 - 您应该在bash和其他POSIX shell中看到for循环的默认处理!

for i in *.txt; do
   mv $i /tmp/
   echo hi
done
mv: cannot stat ‘*.txt’: No such file or directory
hi

Tangential,当没有匹配时的默认行为是将文件glob作为字符串文字获取,使上面的尝试用mv \*.txt /tmp/执行循环,而不是跳过循环。这与shopt有什么关系?

可以在循环之前设置

shopt -s nullglob以使glob扩展为空,for将跳过。但是,您需要shopt -u nullglob,像ls这样的b / c命令将在没有参数的情况下执行,这可能无法正常工作。

总结 - bash接受了某个人想要抛出的“好”想法。无论如何,形象地说。