Como saber se o extglob está ativado na sessão atual do bash?

9

Eu tenho um terminal bash aberto. Quero descobrir se a opção extglob está ativada ou desativada nesta sessão, antes de alterar seu valor. Como posso fazer isso?

becko
fonte
2
Observe que não há necessidade de verificar, a menos que você esteja curioso. Se você quiser, basta executar shopt -s extglobou, se quiser, executar shopt -u extglob. Não faz nenhuma diferença se foi originalmente ou não.
terdon

Respostas:

15

Apenas corra:

$ shopt extglob

Ele retornará o status atual:

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

Para mostrar todas as opções, basta executar:

$ shopt
Jeff Schaller
fonte
Esse também pode ser usado para scripts, seu status de retorno também indica o conjunto de opções ou a configuração, mas a mensagem será padronizada.
cuonglm
11

Use shopt -q :

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

-qA opção shoptdescarta a saída e retorna o status para indicar que as opções estão definidas ou não.

Observe que shoptapenas as opções de relatórios que podem aparecer na BASHOPTSvariável, essas opções não são válidas para o setcomando interno.

Para verificar as opções que são válidas setou que podem aparecer SHELLOPTS, use shopt -qo:

$ bash --posix -c 'shopt -qo posix && echo enable || echo disable'
enable
cuonglm
fonte
2
Por que não apenas shopt extglob?
terdon
1
Porque eu não quero que a saída para mexer o meu fora padrão :)
cuonglm
O que você quer dizer? Tanto quanto posso dizer, o OP quer verificar se a opção está definida ou não. Eles mencionam que isso está em um terminal, então duvido que faça parte de um script. E, afinal, qual é a diferença? Ambos shopt extglobe sua abordagem gravam no stdout. Você está pensando shopt -q extglob && shopt -u extglob || shopt -s extglob?
terdon
@terdon: Bem, minha abordagem só escreve para stdout se eu quiser . A abordagem geral é shopt -q extglob && : Code when enable || : Code when disable.
cuonglm
3
Eu posso imaginar escrever um script que tentaria preservar a configuração existente do usuário, mas pode ter um pouco crítico de código que será interrompido se não for definido de uma maneira específica. Isso sugere um método para determinar silenciosamente o estado atual, salvá-lo e restaurá-lo o mais rápido possível depois de executar as operações cruciais que exigem um estado potencialmente diferente.
Monty mais dura
5

Existem duas listas de opções no bash. Um para shopte um para set.

A opção extglobpertence à shoptlista.
Seu valor pode ser impresso usando shopt extglobou shopt -p extglob.

Uma opção como nounsetpertence à setlista.
Seu valor pode ser impresso usando shopt -op nounsetou shopt -o nounset.

Marque uma opção.

Para imprimir uma opção específica (sem alterá-la) para shopt, use shopt -p name:

$ shopt -p xpg_echo
shopt -u xpg_echo

E para set, use: shopt -po name(sim, você pode usar shopt -oppara setlista).

$  shopt -po xtrace
set +o xtrace

Listar opções.

Para listar todas as opções do shopt, use shopt(ou reutilizável shopt -p).
Também shopt -sou shopt -upode ser usado.

A maneira de listar todas as opções seté com set -o(relacionado set +o:).
Ou: shopt -oé equivalente a set -oe shopt -opé para set +o.

Manual

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

Sem opções ou com a opção -p, é exibida uma lista de todas as opções configuráveis. Se -s ou -u for usado sem argumentos optname, a exibição será limitada às opções definidas ou não, respectivamente.

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

Se -o for fornecido sem o nome da opção, os valores das opções atuais serão impressos. Se + o for fornecido sem o nome da opção, uma série de comandos set para recriar as configurações atuais da opção será exibida na saída padrão.

Exemplos

$ 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

E

$  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

Vale mencionar sobre o shopt -opque realmente lista as setopções:

$ 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

fonte