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

    xiaoxiao2023-03-24  4

    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
    转载请注明原文地址: https://ju.6miu.com/read-1201598.html
    最新回复(0)