Bash似乎将其选项集分为两种类型。我有兴趣了解其原因。
澄清一下,如果我运行shopt
命令,我会得到一个选项及其状态列表(开/关),但如果我运行shopt -o
,我会得到一个不同的选项列表。甚至shopt
(help shopt
)的文档似乎也有这样的区别:
-o restrict OPTNAMEs to those defined for use with `set -o'
换句话说,可以使用set -o
设置选项,但只能使用shopt
命令设置选项。为什么bash包含两组不同的选项?为什么不简单地使用shopt
命令设置所有选项?
答案 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接受了某个人想要抛出的“好”想法。无论如何,形象地说。