什么是 Bash shopt 内置命令?

2025年3月17日 | 阅读 7 分钟

ShoptBash shell 的一个内置命令,用于控制在类 Unix 操作系统上当前 shell 会话中某些选项是启用还是禁用

What is Bash shopt built-in command

描述

下面列出的任何选项都可以使用 shopt 进行修改。

shopt 与内置命令 set 相似但有所不同。使用 set 来修改 bash 的行为,使其表现得好像是使用了不同的命令行选项来启动一样。

语法

shopt [-o] [-p] [-q] [-s] [-u] [optname...]

  • Optname
    它是一个 bash 选项的名称。可以指定多个选项名称,每个名称之间用空格分隔。
  • -o
    optname 值只应使用 set 内置命令所识别的值。
  • -p
    写下所有 shell 选项及其当前值。如果没有提供选项,这是默认操作
  • -q
    这是静默模式。不提供任何输出;而是返回一个错误状态。对于单个 optname,如果选项已设置,则错误状态TRUE (零),如果未设置,则为FALSE (非零)
    如果使用了多个 optname,则每个 optname 的错误状态要么是TRUE(如果所有选项都已设置),要么是FALSE(如果有任何选项未设置)。
  • -s
    如果提供了optnames,则设置这些选项。如果没有提供 optnames,则列出当前所有已选择的选项
  • -u
    它用于禁用 optnames

选项

可以使用 Shopt 设置或取消设置以下设置,它们会影响 bash 的行为。

  • Autocd
    如果设置了此选项,一个以目录命名的命令将像作为 cd 命令的参数一样执行。此选项仅在交互式 shell 中可用。
  • cdable_vars
    如果设置了此选项,一个非目录的 cd 命令参数将被视为一个变量名,该变量的值是要切换到的目录。
  • Cdspell
    如果设置了此标志,cd 命令中目录组件的轻微拼写错误会被修正。检查的错误包括字符换位、缺少字符多余字符。如果找到修正,命令会在打印更新后的文件名后继续执行。此选项仅用于交互式 shell。
  • Checkhash
    如果设置了此选项,bash 在尝试执行一个在其先前记住的命令哈希表中找到的命令之前,会验证该命令是否存在。如果哈希过的命令不再存在,则执行标准的路径搜索。有关 bash 维护的哈希表的更多详细信息,请查看 hash 内置命令
  • Checkjobs
    当此选项启用时,bash 在结束一个交互式 shell 时会列出所有已暂停活动中的作业的状态。如果任何作业仍在运行,它会导致退出延迟,直到进行下一次退出尝试且中间没有命令。如果任何作业已停止,shell 永远不会立即退出。
  • Checkwinsize
    如果设置了该选项,Bash 会在每个命令后根据需要更改 LINESCOLUMNS shell 变量的值。如果设置了该选项,Bash 还会检查活动终端窗口的窗口大小。
  • Cmdhist
    如果选择了此选项,bash 会尝试将多行命令的所有行保存在同一条历史记录中。这使得多行命令可以轻松地再次编辑。
  • compat31
    如果设置此选项,bash 对于 [[ 条件命令 ]] 中 = 操作符的引用参数的行为将更改为版本 3.1 的行为。
  • compat32
    在使用 [[ 条件命令 ]]和 > 操作符时,bash 对于特定于某个区域设置的字符串比较的行为将与版本 3.2 中一样。bash-4.1 之前的 Bash 版本使用 ASCII 排序序列strcmp;bash-4.1 及更高版本使用当前区域设置的排序序列和 strcoll。
  • compat40
    如果为,bash 在中断命令列表的效果以及在使用 [[ 条件命令 ]]和 > 操作符时进行区域特定字符串比较方面,将采用 bash 版本 4.0 的行为。
  • compat41
    如果设置了此选项,当处于 POSIX 模式时,bash 会将双引号参数扩展中的单引号视为特殊字符。单引号之间的字符被视为引用的文本,且单引号必须匹配(成对出现)。这是 bash 版本 4.1 的 POSIX 模式的行为。bash 的默认行为仍然与早期版本相同。
  • Direxpand
    在执行文件名补全时,bash 是否将目录名替换为词语扩展的结果,取决于是否选择了此选项。因此,readline 编辑缓冲区的内容会被修改。如果未设置该选项,bash 会尝试跟踪用户的输入。
  • Dirspell
    如果指定了此选项,在开头提供的目录名不存在的情况下,bash 将尝试对目录名进行拼写纠正
  • Dotglob
    如果启用,路径名通配将包括 bash 输出中以 '.' 开头的文件名。
  • Execfail
    如果启用,非交互式 shell 即使无法打开作为 exec 内置命令参数给出的文件,也会继续运行。如果 exec 失败,交互式 shell 不会终止。
  • expand_aliases
    如果设置,别名将根据 bash 别名文档进行扩展。对于交互式 shell,此选项默认开启
  • Extdebug

如果配置,调试器将激活以下行为:

  1. 对于作为输入提供的每个函数名,declare 内置命令的 -F 选项会显示与其对应的源文件名行号
  2. 如果由 DEBUG 陷阱执行的命令返回一个非的值,则后续命令将被跳过且不执行。
  3. 如果 DEBUG 陷阱的命令返回一个值为 2,而 shell 正在一个函数中运行时,shell 将模拟一次对 return 的调用。
  4. BASH_ARGCBASH_ARGV 已根据其描述进行了更新。
  5. 当函数跟踪启用时,命令替换、shell 函数以及用 (command) 执行的子 shell 会继承 DEBUGRETURN 陷阱。
  6. 当错误跟踪启用时,命令替换、shell 函数和用(command)执行的子 shell会继承ERR陷阱
  • Extglob
    如果配置了此选项,bash 路径名扩展提供的额外模式匹配功能将被启用
  • Extquote
    如果启用此选项,$'string'$"string"$parameter 扩展中将被引用,就像它们被双引号括起来一样。此选项默认开启。
  • Failglob
    如果启用此选项,当路径名扩展时,不匹配文件名的模式将导致扩展错误
  • force_fignore
    当设置了 FIGNORE shell 变量时,即使这些词是唯一可能补全句子的词,带有指定后缀的词在进行单词补全时也会被忽略。此选项默认开启
  • Globstar
    如果设置此选项,模式 ** 在路径名扩展上下文中会包含所有文件零个或多个文件夹子目录。如果模式后面跟着 a /,则只匹配目录和子目录。
  • gnu_errfmt
    如果设置了该选项,Shell 错误消息将使用标准的 GNU 错误消息格式写入。
  • Histappend
    如果设置了此选项,当 shell 终止时,历史列表不会被覆盖,而是会被附加到由 HISTFILE 变量指定的文件中。
  • Histreedit
    如果设置了此选项并且正在使用 readline,用户将有机会重做一次失败的历史替换。
  • Histverify
    如果同时设置了此选项和使用 readline,历史替换的结果将不会立即发送到 shell 解析器。相反,生成的行将被加载到 readline 编辑缓冲区,以便进行进一步的自定义。
  • Hostcomplete
    如果指定了此选项并且正在使用 readline,那么当一个带有 @ 的单词完成时,bash 会尝试补全主机名。通常情况下,此选项是开启的。
  • Huponexit
    如果设置了此选项,bash 将在交互式登录 shell 终止时向所有正在运行的进程发送 SIGHUP 信号
  • interactive_comments
    如果启用此选项,在交互式 shell 中,以 # 开头的单词将导致该单词和该行上的其余字母被忽略。默认情况下,此选项是开启的。
  • Lastpipe
    如果此选项已设置且作业控制未激活,shell 将在当前 shell 环境中执行任何未在后台运行的管道的最后一个命令。
  • Lithest
    如果启用了 cmdhist 选项并进行了配置,多行命令将尽可能地以嵌入换行符的方式保存到历史记录中,而不是使用分号。
  • Mailwarn
    如果指定了该选项,并且 bash 正在搜索邮件的文件自上次检查以来被访问过,则会显示消息“mailfile 中的邮件已被阅读”
  • no_empty_cmd_completion
    如果设置了此选项且 readline 处于活动状态,当在空行上尝试补全时,bash 不会尝试扫描 PATH 以寻找可能的补全项。
  • Nocaseglob
    使用此选项会导致 bash 中的路径名扩展在匹配文件名时不区分大小写。
  • Nocasematch
    如果设置此选项,当执行大小写敏感[[ 条件命令 ]] 时,bash 会在不考虑大小写的情况下匹配模式。
  • Nullglob
    当启用此选项时,bash 允许不匹配任何文件的模式扩展为空字符串,而不是扩展为模式本身。
  • progcomp
    如果设置了此项,可编程补全的功能将被激活。
  • Promptvars
    如果启用,提示字符串在被命令替换、算术扩展和移除引号之前会先进行扩展。此选项默认开启
  • shift_verbose
    如果选中该选项,当移位数大于位置参数数时,shift 内置命令会打印一条错误消息
  • Sourcepath
    如果设置了此选项,source 内置命令将使用 shell 变量 PATH 的值来定位包含作为输入传递的文件的目录。此选项默认开启。

下一主题什么是 LKGC?