#yyds干货盘点# linux命令 shopt

Posted 永远不要放纵自我

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#yyds干货盘点# linux命令 shopt相关的知识,希望对你有一定的参考价值。

shopt 其实很少用到,但是也是有一定作用的。主要就是 shopt命令用于显示和设置shell中的行为选项,通过这些选项以增强shell易用性



shopt 语法

语法很简单: 

shopt [-psu] [optname …]

其中:

-s:激活指定的shell行为选项;

-u:关闭指定的shell行为选项。

-p: 列出所有可设置的选项.执行shopt 看看都有那些选项 与 系统的默认值



shopt命令可以不带参数,若不带任何参数选项,则可以显示所有可以设置的shell操作选项。

[root@master four]# shopt

autocd          off

cdable_vars     off

cdspell         off

checkhash       off

checkjobs       off

checkwinsize    on

cmdhist         on

compat31        off

compat32        off

compat40        off

dirspell        off

dotglob         off

execfail        off

expand_aliases  on

extdebug        off

extglob         on

extquote        on

failglob        off

force_fignore   on

globstar        off

gnu_errfmt      off

histappend      off

histreedit      off

histverify      off

hostcomplete    on

huponexit       off

interactive_comments on

lithist         off

login_shell     on

mailwarn        off

no_empty_cmd_completion off

nocaseglob      off

nocasematch     off

nullglob        off

progcomp        on

promptvars      on

restricted_shell off

shift_verbose   off

sourcepath      on

xpg_echo        off

上面的输出,也就包括了shopt 所支持的所有的参数。



shopt 参数含义说明

上面展示了 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 :

   如果readline正被使用,用户有机会重新编辑一个失败的历史替换


histverify :

如果设置,且readline正被使用,历史替换的结果不会立即传递给shell解释器.而是将结果行装入readline编辑缓冲区中,允许进一步修改


hostcomplete :

          如果设置,且readline正被使用,当正在完成一个包含@的词时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是否受限


shift_verbose  :

             如果该选项设置,当移动计数超出位置参量个数时,shift内置命令将打印一个错误消息


sourcepath  :

             如果设置,source内置命令使用PATH的值来寻找作为参数提供的文件的目录.缺省为打开

source  :

             点(.)的同义词  


shell脚本中 alias 不起作用的问题

默认情况下, shell 中的 alias 是不会有任何作用的。

[root@localhost meng]# shopt expand_aliases

expand_aliases on

[root@localhost meng]#


但是在 sh 脚本中 执行 shopt expand_aliases, 却打印的是false。 郁闷了,奇怪了。

测试发现,只能把  shopt -s expand_aliases 添加到脚本中去;也是不得已。

但是呢, 这个sh脚本 只能在当前 终端起作用, 新的终端就不行了。 

于是,想到放入启动脚本 ~/.bashrc, 

最终,我的脚本如下:

[root@localhost meng]# cat gc.sh 
#!/bin/bash
echo -e "alias t1=\\"echo `date` ++++++\\" " >> ~/.bashrc
# 可以多个...
echo -e "shopt -s expand_aliases" >> ~/.bashrc
#source ~/.bashrc
#shopt expand_aliases
# t1 # 直接测试

之后执行./gc.sh 既可以了吗? gc.sh 中的t1 确实有输出,但是直接执行t1 ,还是报错, 重新打开一个 终端执行t1 也是可以的。。

当前终端,修改了~/.bashrc 不会生效,那么就手动执行吧:

 ./gc.sh  && source  ~/.bashrc

然后就可以直接使用了!


详细说明(转载 )

++++++++++++ 转载 ++++++++++++ 


在非交互式模式下alias扩展功能默认是关闭的,此时仍然可以定义alias别名,但是shell不会将alias别名扩展成对应的命令,而是将alias别名本身当作命令执行,如果shell内置命令和PATH中均没有与alias别名同名的命令,则shell会“抱怨”找不到指定的命令。

如果想使得非交互模式下支持alias扩展, 就要使用shopt expand_aliases. 注意shopt这个命令是shell内置命令,可以控制shell功能选项的开启和关闭,从而控制shell的行为。shopt的使用方式如下:

shopt -s opt_name # Enable (set) opt_name.

shopt -u opt_name # Disable (unset) opt_name.

shopt opt_name # Show current status of opt_name.

测试一下alias在非交互模式的表现和使用shopt的异同:

#!/bin/bash

alias echo_hello=“echo Hello!”

shopt expand_aliases

echo_hello


执行一下:

#> expand_aliases off

#> ./test.sh: line 5: echo_hello: command not found


再次修改 ./test.sh ,在 shopt expand_aliases 前面增加一行 shopt -s expand_aliases , 如下:

shopt -s expand_aliases

shopt expand_aliases

echo_hello

执行一下:

#> ./test.sh

#> expand_aliases on

#> Hello!

另外,alias别名只在当前shell有效,不能被子shell继承,也不能像环境变量一样export。可以把alias别名定义写在.bashrc文件中,这样如果启动交互式的子shell,则子shell会读取.bashrc,从而得到alias别名定义。但是执行shell脚本时,启动的子shell处于非交互式模式,是不会读取.bashrc的。

不过,如果你一定要让执行shell脚本的子shell读取.bashrc的话,可以给shell脚本第一行的解释器加上参数:

#!/bin/bash --login

–login使得执行脚本的子shell成为一个login shell,login shell会读取系统和用户的profile及rc文件,因此用户自定义的.bashrc文件中的内容将在执行脚本的子shell中生效。

还有一个简单的办法让执行脚本的shell读取.bashrc,在脚本中主动source ~/.bashrc即可。

还有一种解决办法是用source命令:

source script.sh

使当前shell读入路径为script.sh的文件并依次执行文件中的所有语句。

那么source和sh去执行脚本有什么不同呢?

sh script.sh 会重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell是新建的,其改变的变量不会被带回父shell,除非使用export。

source script.sh是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。

那么sh script.sh和./script.sh又有什么不同呢?

相同的是它们都是新建一个子shell去执行脚本,不同的是./script.sh要求script.sh必须具有执行权限。

一个简单的alias的例子是:

alias ll=ls -l


————————————————

部分转载于  https://blog.csdn.net/qq_33709508/article/details/101822329



以上是关于#yyds干货盘点# linux命令 shopt的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点#linux命令--hdparm

#yyds干货盘点#linux命令--cat

#yyds干货盘点#linux命令--grep

#yyds干货盘点#linux命令--which,find

#yyds干货盘点#linux命令--Hostname 显示主机名

#yyds干货盘点#linux命令--rm,rmdir,mv