Como posso listar as opções do bash'es para o shell atual?

27

O próprio intérprete do bash tem opções, ou seja,

Linhas 22-23 da página de manual do bash:

OPTIONS  
All of the  single-character shell options documented in the description of the set builtin command can be used as options when the shell is invoked.   In addition, bash interprets the following options when it is invoked:  
-c ...  
-i ...  
-l ...  
-r ...  

Eu usei alguns padrões de pesquisa na página de manual do bash, como:

  • /^\s*set
  • /list

É possível imprimir uma lista dessas configurações aplicadas ao shell atual?

the_velour_fog
fonte

Respostas:

26
printf %s\\n "$-"

Irá listar as opções de letra única em uma única sequência.

Esse parâmetro também pode ser usado como:

set -f -- ${-:+"-$-"}
echo *don\'t* *glob* *this*
set +f "$@"

Para primeiro desabilitar a -fexpansão nome do arquivo de shell e salvar simultaneamente um valor para $-- se houver - em $1. Em seguida, nenhum globs ocorre e a +fexpansão do último nome de arquivo é ativada novamente e, possivelmente, também desativada.

Por exemplo, se a -fexpansão ilename já estava desativada quando o valor de $-foi salvo pela primeira vez, seu valor salvo seria (pelo menos) :

f

E assim, quando seté executado novamente, funciona:

set +f -f

O que apenas o coloca de volta onde você começou.

set +o

Irá listar todas setas opções de shell da tabela (consulte a resposta de Jason para asshopt opções capazes - isso é uma palavra? -) em um formato que seja seguro para a reinserção do shell. Dessa forma, você também pode fazer:

state=$(set +o)
set -some -crazy -options
eval "$state"

Para salvar, alterar e restaurar o estado das opções do shell, respectivamente.

Para manipular shoptíons e setopções de tabela de uma só vez:

state=$(set +o;shopt)
#do what you want with options here
eval "$state"

Você também pode chamar set sem argumentos para adicionar uma lista de todas as variáveis ​​definidas no momento do shell - também citadas para reinserção no shell. E você pode - no bash - adicionar adicionalmente o comando typeset -fppara incluir também todas as funções shell declaradas no momento. Você pode agrupar tudo junto e evalquando estiver pronto. Você pode até ligar aliassem argumentos para mais do mesmo. Isso ... pode cobrir, no entanto. Eu acho que existe "$@"- o que você teria que colocar em uma bashmatriz primeiro, suponho, antes de fazer set.

Não, há também trap. Este é um pouco engraçado. Geralmente:

trap 'echo this is my trap' 0
(echo this is my subshell; trap)

... apenas imprimirá este é o meu subshell porque o subshell é um novo processo e obtém seu próprio conjunto de traps - e, portanto, não herda nenhum traps, exceto aqueles que seu pai ignorou explicitamente - (como trap '' INT) .

Contudo:

trap 'echo this is my trap' 0
save_traps=$(trap)

trapse comporta especialmente quando é o primeiro e único comando executado em um subshell de substituição de comando, na medida em que reproduz uma lista do shell pai atualmente definido trapsem um formato que é citado para reentrada segura no shell. E assim você pode fazer o save_traps, em seguida, set sem argumentos - e todo o resto já foi mencionado - a praticamente obter um bloqueio em todo o estado shell. Você pode adicionar export -pe readonly -prestaurar explicitamente os atributos originais do shell var.

Enfim, isso é o suficiente.

mikeserv
fonte
obrigado, seu código funciona bem. para obter uma lista completa de todas as opções, você teria que usar as duas set +o e shopt ? (como a shoptcapacidade de ser uma palavra, settableé usada na página de homem, assim shoptablefunciona para mim)
the_velour_fog
@ user4668401 - Eu acho que vai fazer isso.
mikeserv
TL; DR, mas +1000 para a solução de 3 linhas para alterar uma opção e colocá-la de volta 'como estava'. É exatamente disso que se precisa ao criar scripts ou instruções de copiar / colar.
Balmipour
@mikeserv Parece que -p necessidades opção a ser adicionado quando a economia de estado incluir shoptiões, isto é,state=$(set +o;shopt -p)
nkatsar
9

Na manpágina:

shopt
... Sem opções ou com a opção -p, uma lista de todas as opções configuráveis ​​é exibida, com uma indicação de se cada uma delas está ou não definida.
shopt | grep on

imprimirá uma lista de todas as opções ativadas.

jasonwryan
fonte
isso funcionou, obrigado. Você sabe se isso lista as opções que podem ser definidas por ambos sete shopt?
the_velour_fog
@ user4668401 Não, seté muito mais extenso: consulte a entrada da página de manual .
jasonwryan
E para verificar se existe uma única opção:shopt <option>
kos
isso incluirá opções com 'on' no nome (ie huponexit). maneira simples de corrigir éshopt | grep on$
Mike D
6

Para listar todas as opções:

set -o

Para inspecionar uma opção específica:

set -o | grep <OPTION>

Tome a opção verbosecomo exemplo:

$ set -o | grep verbose
verbose         off
Jeremy Kao
fonte
6

Opções ?: Existem três grupos de opções no bash.

  1. As opções lidas ou definidas pelo comando set.
    (use este comando para o manual LESS=+/'set \[--abefhkmnptuvxBCEHPT\]' man bash:)
    Todas as opções de uma letra:abefhkmnptuvxBCEHPT

    Também as opções (que não têm uma única letra equivalente):

    set -o emacs
    set -o history
    set -o ignoreeof
    set -o interactive-comments
    set -o pipefail
    set -o posix
    set -o vi
  2. As opções lidas ou definidas pelo comando shopt.
    (leia o manual com este comando LESS=+/'shopt \[-pqsu\]' man bash':)
    A lista é bastante longa, mas fácil de imprimir, use:

    $ shopt -p

    ou similar (mas não igual):

    $ shopt
  3. As opções que podem ser definidas na invocação:
    (comando para o manual: LESS=+/'^INVOCATION' man bash)

    Todas as setopções:

    bash -abefhkmnptuvxBCEHPT

    Todas as shoptopções

    bash -O option

    Algumas opções que são significativas apenas quando o INVOKING bash:

    bash -lirsDc

    E também (opções longas):

    bash --debugger --help --init-file file --rcfile file --login \
         --noediting --noprofile --norc --posix --restricted \
         --verbose --version

Todas as setopções de uma letra e -risão impressas com $-.

-i      Interactive  
Only read with `$-` (if it contains an `i`).
-r      Restricted
Also read with `shopt -p restricted_shell

Por exemplo:

$ echo 'echo $0 $-' | bash -abefhikmprtuvxBCEHPT -lri

Chamar o bash como um shell de login é relatado apenas com o shopt:

-l      Login
read with `shopt -p login_shell`

Portanto:

$ echo 'shopt -p login_shell' | bash -abefhikmprtuvxBCEHPT -lri
shopt -s login_shell

A opção -nnão pode ser testada por nenhum código, pois significa: não execute nenhum código.


Opções de impressão

A melhor ferramenta para listar as opções do shell em execução , as definidas com setou as definidas com, shopté a mesma shopt. Para listar opções definidas:

shopt -o

O que age exatamente como set -o. Use shopt -popara obter o mesmo resultado que set +o.

Para listar opções de compras:

shopt -p

Das quais você pode optar por imprimir os definidos shopt -psou nãoshopt -pu

Para obter todas as opções. Tanto quanto possível, muitas opções longas e algumas ( -sDc) em INVOCATION não podem ser impressas:

$ echo $-; shopt -p ; shopt -po

Para armazená-los em uma variável:

$ storeoptions="$(echo "set -$-"; shopt -p ; shopt -po)"

E a variável pode ser usada para retroceder todas as opções:

$ eval "$storeoptions"

fonte
1

Para inspecionar uma opção específica:

if shopt -q <OPTION>
then echo '<OPTION> is set'
fi
Bruce
fonte