shopt命令用于显示和设置shell中的行为选项,通过这些选项以增强shell易用性。shopt命令若不带任何参数选项,则可以显示所有可以设置的shell操作选项。
语法
shopt(选项)(参数)
选项
-s:激活指定的shell行为选项;
-u:关闭指定的shell行为选项。
参数
shell选项:指定要操作的shell选项。
实例
使用shopt命令显示当前所有可以设置的shell操作选项,输入如下命令:
shopt #输出所有可以设置的shell操作选项
cdable_vars off
cdspell off
checkhash off
checkwinsize on
cmdhist on
dotglob off
execfail off
expand_aliases on
extdebug off
…
如图上所示,选项"cdspell"的状态为"off",即关闭cd拼写检查选项。现在,可以使用shopt命令将其开启,输入如下命令:
shopt -s cdspell #开启cd拼写检查
执行上面的命令后,该选项的状态将变为"on",即开启状态。可以再次通过该命令显示一下shell操作选项即可,输出信息如下:
cdspell on #开启cdspell选项
用户可以通过实际执行cd命令检查该选项是否被成功开启。
[root@localhost ~]# shopt -s cdspell #把cdspell选项打开
[root@localhost ~]# shopt -p cdspell #打印cdspell设置
shopt -s cdspell
[root@localhost ~]# cd /raot #故意拼写错误
/root
[root@localhost ~]# pwd #查看当前目录
/root
[root@localhost ~]# cd /usr/loca/bin #故意拼写错误
/usr/local/bin
[root@localhost bin]# pwd #查看当前目录
/usr/local/bin
[root@localhost bin]# shopt -u cdspell #把cdspell选项打开
[root@localhost bin]# shopt -p cdspell #打印cdspell设置
shopt -u cdspell
[root@localhost bin]# cd /raot #故意拼写错误
-bash: cd: /raot: 没有那个文件或目录 #进入目录错误
开启与关闭
开启shopt命令:shopt -s extglob
关闭shopt命令:shopt -u extglob
开启之后,以下5个模式匹配操作符将被识别:
?(pattern-list) - 所给模式匹配0次或1次;
*(pattern-list) - 所给模式匹配0次以上包括0次;
+(pattern-list) - 所给模式匹配1次以上包括1次;
@(pattern-list) - 所给模式仅仅匹配1次;
!(pattern-list) - 不匹配括号内的所给模式。
实例:
//删除文件名不以jpg结尾的文件:
rm -rf !(*jpg)
//删除文件名以jpg或png结尾的文件:
rm -rf *@(jpg|png)
shopt命令选项
选项 | 含义 |
---|---|
cdable_vars | 如果给cd内置命令的参数不是一个目录,就假设它是一个变量名,变量的值是将要转换到的目录 |
cdspell | 纠正cd命令中目录名的较小拼写错误。检查的错误包括颠倒顺序的字符,遗漏的字符以及重复的字符。如果知道一处修改,正确的路径就打印出,命令将继续。只用于交互式shell |
checkhash | bash在试图执行一个命令前,先在哈希表中寻找,以确定命令是否存在。如果命令不存在,就执行正常路径搜索 |
checkwinsize | bash在每个命令后检查窗口大小,如果有必要,就更新LINES和COLUMNS的值 |
cmdhist | bash试图将一个多行命令的所有行保存在同一个历史项中。这使得多行命令的重新编辑更方便 |
dotglob | bash在文件名扩展的结果中包括以点(.)开头的文件名 |
execfail | 如果一个交互式shell不能执行指定给exec内置命令作为参数的文件,它不会退出。如果exec失败,一个交互式shell不会退出 |
expand_aliases | 别名被扩展。默认为打开 |
extglob | 打开扩展的模式匹配特征(正常的表达式元字符来自Korn shell的文件名扩展) |
histappend | 当shell退出时,历史清单将添加到以HISTFILE变量的值命名的文件中,而不是覆盖文件 |
histreedit | 如果readline正被使用,用户有机会重新编辑一个失败的历史替换 |
histverify | 如果设置,且readline正被使用,历史替换的结果不会立即传递给shell解析器。而是将结果行装入readline编辑缓冲区中,允许进一步修改 |
hostcomplete | 如果设置,且readine正被使用,当正在完成一个包含@的词时bash将试图执行主机名补全。默认为打开 |
huponexit | 如果设置,当一个交互式登陆shell退出时,bash将发送一个SIGHUP(挂起信号)给所有的作业 |
interactive_comments | 在一个交互式shell中,允许以#开头的词以及同一行中其他的字符被忽略。默认为打开 |
lithist | 如果打开,且cmdhist选项也打开,多行命令将用嵌入的换行符保存到历史中,而无需在可能的地方用分号来分隔 |
mailwarn | 如果设置,且bash用来检查邮件的文件自从上次检查后已经被访问,将显示消息“The mail in mailfile has been read” |
nocaseglob | 如果设置,当执行文件名扩展时,bash在不区分大小写的方式下匹配文件名 |
nullglob | 如果设置,bash允许没有匹配任何文件的文件名模式扩展成一个空串,而不是它们本身 |
promptvars | 如果设置,提示串在被扩展后再经历变量和参量扩展。默认为打开 |
restricted_shell | 如果shell在受限模式下启动就设置这个选项。该值不能被改变。当执行启动文件时,不能复位该选项,允许启动文件发现shell是否是受限的 |
sourcepath | 如果设置,source内置命令使用PATH的值来寻找包含作为参数提供的文件的目录。默认为打开 |
source | 点(.)的同义词 |
shift_verbose | 如果该选项设置,当移动计数超过位置参量个数时,shift内置命令将打印一个错误消息 |