set
和shopt
都是控制各种选项的 shell 内置命令。我经常忘记哪些选项是由哪个命令设置的,以及哪个选项设置/取消设置(set -o/+o
, shopt -s/-u
)。为什么有两个不同的命令看似执行相同的操作(并且有不同的参数来执行此操作)?有没有简单的方法/助记符来记住哪个选项与哪个命令搭配?
答案1
据我所知,这些set -o
选项是从其他 Bourne 风格的 shell(主要是 ksh)继承的选项,并且这些shopt
选项是 bash 特有的选项。据我所知,没有任何逻辑。
答案2
不同之处在于 bash 使用的环境变量发生了变化。使用set
命令设置结果为$SHELLOPTS
.使用shopt
命令设置结果为$BASHOPTS
.
答案3
set
是 POSIX 7:set - 设置或取消设置选项和位置参数 | pubs.opengroup.org
可能与@Gilles提到的历史。
答案4
来自《Linux Shell Scripting with Bash》一书,第 63 页:
从历史上看,该
set
命令用于打开和关闭选项。随着选项数量的增加,set
使用变得越来越困难,因为选项由单字母代码表示。因此,Bash 提供了shopt
(外壳选项) 命令通过名称而不是字母打开和关闭选项。您只能通过字母设置某些选项。其他的只能在shopt
命令下使用。这使得查找和设置特定选项成为一项令人困惑的任务。