Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I have a bash terminal open. I want to find out whether the option extglob is enabled or disabled in this session, before I change its value. How can I do this?

share|improve this question
1  
Note that there's no need to check unless you're curious. If you want it on, just run shopt -s extglob or, if you want it off, run shopt -u extglob. It doesn't make any difference whatsoever if it was on originally or not. – terdon Jan 14 at 17:19
up vote 7 down vote accepted

Just run:

$ shopt extglob

It will return the current status:

$ shopt extglob 
extglob         on
$ shopt -u extglob 
$ shopt extglob 
extglob         off

To show all options, just run:

$ shopt
share|improve this answer
    
This one can also be used for scripting, its return status also indicate option set or unset, but the message will mess standard out. – cuonglm Jan 14 at 17:10

Use shopt -q:

shopt -q extglob && echo enable || echo disable

-q option make shopt discard output, and return status to indicate that options set or unset.

Note that shopt only reports options which can appear in BASHOPTS variable, those options are not valid to set builtin command.

To check for options which are valid to set, or can be appear in SHELLOPTS, use shopt -qo:

$ bash --posix -c 'shopt -qo posix && echo enable || echo disable'
enable
share|improve this answer
2  
Why not just shopt extglob? – terdon Jan 14 at 17:00
1  
Because I don't want the output to mess my standard out :) – cuonglm Jan 14 at 17:09
    
What do you mean? As far as I can tell, the OP wants to check whether the option is set or not. They mention that this is in a terminal, so I doubt it's part of a script. And, anyway, what's the difference? Both shopt extglob and your approach will write to stdout. Are you thinking of shopt -q extglob && shopt -u extglob || shopt -s extglob? – terdon Jan 14 at 17:11
    
@terdon: Well, my approach only write to stdout if I want. The general approach is shopt -q extglob && : Code when enable || : Code when disable. – cuonglm Jan 14 at 17:16
2  
I can imagine writing a script that would attempt to preserve the user's existing setting, but might have a critical bit of code that will break if it's not set a particular way. This suggests a method to silently determine the current state, save it, and restore it ASAP after performing the crucial operations that require potentially-different state. – Monty Harder Jan 14 at 19:07

There are two lists of options in bash. One for shopt and one for set.

The option extglob belongs to the shopt list.
Its value may be printed by using either shopt extglob or shopt -p extglob.

An option like nounset belongs to the set list.
Its value may be printed by using shopt -op nounset or shopt -o nounset.

Check one option.

To print an specific option (without changing it) for shopt, use shopt -p name:

$ shopt -p xpg_echo
shopt -u xpg_echo

And for set, use: shopt -po name (yes, you may use shopt -op for set list).

$  shopt -po xtrace
set +o xtrace

List options.

To list all options from shopt, use shopt (or reusable shopt -p).
Also shopt -s or shopt -u could be used.

The way to list all options to set is with set -o (related: set +o).
Or: shopt -o is equivalent to set -o and shopt -op is to set +o.

Manual

From LESS=+/'^ *shopt \[' man bash:

With no options, or with the -p option, a list of all settable options is displayed, If either -s or -u is used with no optname arguments, the display is limited to those options which are set or unset, respectively.

From LESS=+/'^ *set \[' man bash:

If -o is supplied with no option-name, the values of the current options are printed. If +o is supplied with no option-name, a series of set commands to recreate the current option settings is displayed on the standard output.

Examples

$ set -o
allexport       off
braceexpand     on
emacs           on
errexit         off
errtrace        off
functrace       off
hashall         on
histexpand      on
history         on
ignoreeof       off
interactive-comments    on
keyword         off
monitor         on
noclobber       off
noexec          off
noglob          off
nolog           off
notify          off
nounset         off
onecmd          off
physical        off
pipefail        off
posix           off
privileged      off
verbose         off
vi              off
xtrace          off

And

$  shopt -sp
shopt -s checkwinsize
shopt -s cmdhist
shopt -s expand_aliases
shopt -s extglob
shopt -s extquote
shopt -s force_fignore
shopt -s histappend
shopt -s histverify
shopt -s interactive_comments
shopt -s progcomp
shopt -s promptvars
shopt -s sourcepath

It is worth mentioning about shopt -op which actually lists set options:

$ shopt -op
set +o allexport
set -o braceexpand
set -o emacs
set +o errexit
set +o errtrace
set +o functrace
set -o hashall
set -o histexpand
set -o history
set +o ignoreeof
set -o interactive-comments
set +o keyword
set -o monitor
set +o noclobber
set +o noexec
set +o noglob
set +o nolog
set +o notify
set +o nounset
set +o onecmd
set +o physical
set +o pipefail
set +o posix
set +o privileged
set +o verbose
set +o vi
set +o xtrace
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.