首页 » 信息技术 »

set和shopt

2019年3月1日 / 68次阅读
Shell

set和shopt都是bash中的内置命令。shopt顾名思义,就是shell options的简写,用来通知bash shell的行为特征。set也可以用来设置bash的行为特征,但是set还有其它的一些功能。这两个命令有的时候会混淆,需要一点解释。

set 命令有三种功能:显示所有的变量和函数;修改 Bash 的位置参数;控制 Bash 的第一套选项。可见 set 命令完全违背了“一个命令只干一件事”的 UNIX 哲学。set 命令是 Bash 从 sh 继承来的,而且它和它的大多数选项一起都是在 POSIX 规范中的。而 shopt 是 Bash 在 2.0 版本时新增的,别的 Shell 没有这个命令。

直接输入set命令,回车,可以看到当前shell下所有的变量和函数。

我们常常用unset命令来删除变量,用unset -f来删除函数。这个功能是shopt命令没有的。当然,也可以认为unset是另外一个命令。

用set来控制bash shell的行为特征是,有一个别扭的地方,即去掉某个选项用+号,设置用-号。当然这也是没有办法,最初所有的程序命令的参数都是用-来确认的。

[xinlin@promote ~]$ echo $-
himBH
[xinlin@promote ~]$ set +h  # unset h
[xinlin@promote ~]$ echo $-
imBH
[xinlin@promote ~]$ set -h  # set h
[xinlin@promote ~]$ echo $-
himBH

set -o命令,可以看到所有通过set命令可以配置的shell选项。

而shopt命令的功能就比较单一,就是用来设置shell选项的,而且能够设置的选项比set要多,当然部分是重复的。

[xinlin@promote ~]$ set -o | wc -l
27
[xinlin@promote ~]$ shopt | wc -l
43

set有27个选项,shopt有43个。注意:不同的系统和版本,这个数量会不太一样。

shopt可以控制set中独有的选项,但是反过来不行。

[xinlin@promote ~]$ help shopt
shopt: shopt [-pqsu] [-o] [optname ...]
Set and unset shell options.

Change the setting of each shell option OPTNAME. Without any option
arguments, list all shell options with an indication of whether or not each
is set.

Options:
-o restrict OPTNAMEs to those defined for use with `set -o'
-p print each shell option with an indication of its status
-q suppress output
-s enable (set) each OPTNAME
-u disable (unset) each OPTNAME

Exit Status:
Returns success if OPTNAME is enabled; fails if an invalid option is
given or OPTNAME is disabled.

用-o这个模式,shopt就可以设置在set -o中才有的选项。

 

总结一下:修改bash shell的选项,最好通过shopt,清晰明了;set也可以干这个事情,不过是由于一些历史原因,兼容是很重要的;set和unset,用来查看和删除变量和函数。

本文链接:https://www.maixj.net/ict/set-shopt-20360

相关文章

留言区

《set和shopt》有2条留言

  • 麦新杰

    set命令会将函数的内容一并打印出来:

    [xinlin@localhost lamp]$ . func.sh
    [xinlin@localhost lamp]$ set
    BASH=/bin/bash
    BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
    BASH_ALIASES=()
    BASH_ARGC=()
    BASH_ARGV=()
    BASH_CMDS=()
    BASH_LINENO=()
    BASH_SOURCE=()
    BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")
    BASH_VERSION='4.2.46(2)-release'
    COLUMNS=108
    DIRSTACK=()
    DISPLAY=localhost:10.0
    EUID=1000
    GROUPS=()
    HISTCONTROL=ignoredups
    HISTFILE=/home/xinlin/.bash_history
    HISTFILESIZE=1000
    HISTSIZE=1000
    HOME=/home/xinlin
    HOSTNAME=localhost.localdomain
    HOSTTYPE=x86_64
    ID=1000
    IFS=$' \t\n'
    LANG=en_US.UTF-8
    LESSOPEN='||/usr/bin/lesspipe.sh %s'
    LINES=50
    LOGNAME=xinlin
    LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:'
    MACHTYPE=x86_64-redhat-linux-gnu
    MAIL=/var/spool/mail/xinlin
    MAILCHECK=60
    OLDPWD=/home/xinlin
    OPTERR=1
    OPTIND=1
    OSTYPE=linux-gnu
    PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/xinlin/.local/bin:/home/xinlin/bin
    PIPESTATUS=([0]="0")
    PPID=7595
    PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
    PS1='[\u@\h \W]\$ '
    PS2='> '
    PS4='+ '
    PWD=/home/xinlin/lamp
    PYTHONPATH=/home/xinlin
    SELINUX_LEVEL_REQUESTED=
    SELINUX_ROLE_REQUESTED=
    SELINUX_USE_CURRENT_RANGE=
    SHELL=/bin/bash
    SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
    SHLVL=1
    SSH_CLIENT='192.168.75.1 63536 22'
    SSH_CONNECTION='192.168.75.1 63536 192.168.75.128 22'
    SSH_TTY=/dev/pts/0
    TERM=xterm
    UID=1000
    USER=xinlin
    XDG_RUNTIME_DIR=/run/user/1000
    XDG_SESSION_ID=2
    _=func.sh
    colors=/home/xinlin/.dircolors
    isDirThere ()
    {
        if [ $# -ne 1 ]; then
            return 3;
        fi;
        if [ -d $1 ]; then
            return 0;
        else
            return 1;
        fi
    }
    isFileThere ()
    {
        if [ $# -ne 1 ]; then
            return 3;
        fi;
        if [ -e $1 ]; then
            return 0;
        else
            if [ -h $1 ]; then
                return 2;
            fi;
            return 1;
        fi
    }
    isInteractiveMode ()
    {
        case "$-" in
            *i*)
                return 0
            ;;
            *)
                return 1
            ;;
        esac
    }
    [xinlin@localhost lamp]$
    
     []

    • 麦新杰

      显示的函数,去掉了所有注释,并且进行标准化的重新排版。 []


前一篇:
后一篇:

栏目精选

云上小悟,麦新杰的独立博客

Ctrl+D 收藏本页

栏目


©Copyright 麦新杰 Since 2014 云上小悟独立博客版权所有 备案号:苏ICP备14045477号-1。云上小悟网站部分内容来源于网络,转载目的是为了整合信息,收藏学习,服务大家,有些转载内容也难以判断是否有侵权问题,如果侵犯了您的权益,请及时联系站长,我会立即删除。

网站二维码
go to top