您的位置:首页 > 运维架构 > Shell

【Bash百宝箱】shell内建命令之set、shopt

2016-09-27 21:13 597 查看

1、set

在shell中,内建(builtin)命令set,格式如下:

set [--abefhkmnptuvxBCEHPT] [-o option-name] [arg ...]
set [+abefhkmnptuvxBCEHPT] [+o option-name] [arg ...]


set命令用以改变bash默认行为,不指定任何选项和参数时,显示所有shell变量的名称及值,包括shell函数,但在posix模式下只显示shell变量。显示结果是根据当前语系进行排序的,输出形式是一种友好的可以直接用来设置变量的格式,只读变量不能进行重置。当指定了某些选项时,就可以设置shell属性了,选项后面的所有参数arg当作位置参数进行处理。

下面是set命令各选项的含义。

“-a”:自动标记创建或修改的变量和函数,它们可以导出到后续命令的环境中。

“-b”:启用了作业控制时这个命令才有效,即时报告后台作业终止时的状态,而不是等待下一个shell主提示符。

“-e”:管道、列表、组合命令的退出状态非0时立即退出,但这些命令为while或until后面的命令、if或elif后面的测试命令、最后一个“&&”或“||”前面的命令、管道中不是最后一个的命令或者是使用了“!”的命令时,则不会立即退出。忽略这个选项时,组合命令而非子shell返回false时不会退出shell。如果通过内建命令trap设置了“ERR”,它们在shell退出前执行。这个选项作用于当前shell及其子shell,那么,子shell在执行完所有命令前就可能提前退出了。需要注意的是,如果当前环境忽略了这个选项,即使设置了这个选项且返回false,组合命令或shell函数执行时也不受这个选项影响。

“-f”:禁止路径名扩展。

“-h”:查找命令执行时记住命令位置,默认状态是打开的。

“-k”:把以赋值语句形式出现的所有参数都放置到命令环境中,而不仅仅是命令名前面的那部分内容。

“-m”:监控模式,启用作业控制,支持交互式shell时才有效,所有进程都处于独立的进程组,后台作业结束时,shell打印出退出状态。

“-n”:读取命令但不执行它们,可用于shell脚本语法检查,在交互式shell中忽略。

“-o allexport”:同“-a”。

“-o braceexpand”:同“-B”。

“-o emacs”:使用emacs风格的命令行编辑,对内建命令“read -e”有影响。交互式shell中默认使用这个选项,除非启动shell时使用了选项“–noediting”。

“-o errexit”:同“-e”。

“-o errtrace”:同“-E”。

“-o functrace”:同“-T”。

“-o hashall”:同“-h”。

“-o histexpand”:同“-H”。

“-o history”:启用历史命令,交互式shell中默认启用。

“-o ignoreeof”:同执行过的shell命令“IGNOREEOF=10”。

“-o keyword”:同“-k”。

“-o monitor”:同“-m”。

“-o noclobber”:同“-c”。

“-o noexec”:同“-n”。

“-o noglob”:同“-f”。

“-o nolog”:忽略。

“-o nofity”:同“-b”。

“-o nounset”:同“-u”。

“-o onecmd”:同“-t”。

“-o physical”:同“-p”。

“-o pipefail”:默认禁止,启用这个选项时命令返回值为最后一个失败的命令的退出状态,如果所有命令都执行成功则返回0。

“-o posix”:启用POSIX模式,会影响bash操作。

“-o previleged”:同“-p”。

“-o verbose”:同“-v”。

“-o vi”:使用vi风格的命令行编辑,对内建命令“read -e”有影响。

“-o xtrace”:同“-x”。

如果使用了选项“-o”却没有指定“option-name”,则打印当前所有选项的状态(on或off),如果使用了选项“+o”却没有指定“option-name”,则以set命令的语法格式打印当前所有的选项。

“-p”:打开特权privileged模式,在这种模式下,不处理
“$ENV”
“$BASH_ENV”
文件,不继承shell函数,忽略shell变量SHELLOPTS、BASHOPTS、CDPATH和GLOBIGNORE。如果启动shell时有效用户(组)不同于实际用户(组),且没有设置这个选项,特权模式下的操作会执行,还会设置有效用户为实际用户。如果在shell启动时设置了这个选项,有效用户则不会被重置。关闭这个选项,有效用户和组就会被重置为实际用户和组。

“-t”:读取命令执行后退出。

“-u”:进行参数扩展时,参数(不包括特殊参数“@”和“*”)没有设置就报错,在交互式shell中打印出错信息,非交互式shell则退出并返回false。

“-v”:打印读取的shell输入行。

“-x”:在shell简单命令、for、case、select或算术for命令扩展后,显示“PS4”的扩展值,随后是命令及扩展后的参数。

“-B”:默认打开,扩展大括号。

“-C”:对于重定向运算符“>”、“&>”和“<>”,不覆盖已存在的文件,使用“>|”重定向时会覆盖。

“-E”:对于内建命令trap的“ERR”,可以被shell函数、命令替换和子shell中的命令继承,默认是不继承的。

“-H”:打开历史命令“!”,在交互式shell有效。

“-P”:不跟踪符号链接,使用物理地址。

“-T”:trap的“DEBUG”和“RETURN”可以被shell函数、命令替换和子shell中的命令继承,默认是不继承的。

“–”:如果这个选项后面没有其他参数,位置参数将被重置,否则,即使有以“-”开头的参数,位置参数也会被设置为参数arg。

“-”:表示选项结束,让后续参数arg赋值给位置参数,“-x”和“-v”被关闭,如果没有其他的参数arg,位置参数保持不变。

set命令的大部分选项默认是关闭的,减号“-”打开,加号“+”关闭,这些选项可以作为启动shell时的参数,启动参数保存在变量“$-”中。

查看启动参数:

$ echo $-
himBH


未定义变量进行参数扩展时报错:

$ unset foo
$ echo $foo

$ set -u
$ echo $foo
bash: foo: unbound variable
$ set +u
$ echo $foo


打印读取的shell输入行:

$ uname
Linux
$ set -v
$ uname
uname
Linux
$ set +v
set +v
$ uname
Linux


打开与关闭历史命令:

$ set -H
$ uname
Linux
$ !!
uname
Linux
$ set +H
$ uname
Linux
$ !!
!!: command not found


重置位置参数:

$ foo() { echo "foo:" $1 $2; }
hanjunjie@hanjunjie-HP:~$ foo a b
foo: a b
$ foo() { set --; echo "foo:" $1 $2; }
$ foo a b
foo:


2、shopt

shopt是另一个可以改变shell行为的内建(builtin)命令,格式如下

shopt [-pqsu] [-o] [optname ...]


“-s”:打开/设置optname。

“-u”:关闭/取消optname。

“-p”:以shopt命令的输入格式显示optname的状态。

“-q”:quiet模式,不输出optname及其状态,只是可以通过shopt命令的退出状态来查看某个optname是否打开或关闭。

“-o”:限制optname为内建命令set的选项“-o”支持的那些值。

下面看一下shopt的默认状态。

打开的:

$ shopt -s
checkwinsize    on
cmdhist         on
complete_fullquote  on
expand_aliases  on
extglob         on
extquote        on
force_fignore   on
histappend      on
interactive_comments    on
progcomp        on
promptvars      on
sourcepath      on


关闭的:

$ shopt -up
shopt -u autocd
shopt -u cdable_vars
shopt -u cdspell
shopt -u checkhash
shopt -u checkjobs
shopt -u compat31
shopt -u compat32
shopt -u compat40
shopt -u compat41
shopt -u compat42
shopt -u direxpand
shopt -u dirspell
shopt -u dotglob
shopt -u execfail
shopt -u extdebug
shopt -u failglob
shopt -u globstar
shopt -u globasciiranges
shopt -u gnu_errfmt
shopt -u histreedit
shopt -u histverify
shopt -u hostcomplete
shopt -u huponexit
shopt -u lastpipe
shopt -u lithist
shopt -u login_shell
shopt -u mailwarn
shopt -u no_empty_cmd_completion
shopt -u nocaseglob
shopt -u nocasematch
shopt -u nullglob
shopt -u restricted_shell
shopt -u shift_verbose
shopt -u xpg_echo
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: