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

21

O intprete do bash tem opções, por exemplo

Linhas 22-23 da página man 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 man page do bash como:

  • /^\s*set
  • /list

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

    
por the_velour_fog 17.06.2015 / 09:04

5 respostas

20
printf %s\n "$-"

Relacionará as opções de letras únicas em uma única string.

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

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

Primeiro, desative a expansão shell -f ilename e, ao mesmo tempo, salve um valor para $- - se houver - em $1 . Em seguida, nenhum globs ocorre e a última expansão +f ilename está novamente ativada e, possivelmente, também desativada.

Por exemplo, se a expansão -f ilename já estivesse desativada quando o valor de $- fosse salvo pela primeira vez, seu valor salvo seria (pelo menos) :

f

E assim, quando set for executado novamente, funcionará para:

set +f -f

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

set +o

Listará todas as opções de shell de tabela set (consulte a resposta de Jason para o shopt capaz - é que uma palavra? - opções) em um formulário que é seguro para a reentrada da 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 processar as opções shopt ions e set table de uma só vez:

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

Você também pode chamar set sem quaisquer argumentos para adicionar uma lista de todas as variáveis definidas atualmente no shell - também citadas como reentrada no shell. E você pode - no bash - adicionar adicionalmente o comando typeset -fp para incluir também todas as funções de shell atualmente declaradas. Você pode juntar tudo e eval quando estiver pronto. Você pode até mesmo chamar alias sem argumentos para mais do mesmo. Isso ... pode cobri-lo, no entanto. Eu acho que há "$@" - que você teria que colocar em uma matriz bash primeiro, suponho, antes de fazer set .

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

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

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

No entanto:

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

trap comporta-se especialmente quando é o primeiro e o único executado em uma sub-rotina de substituição de comandos, na medida em que reproduzirá uma lista do conjunto traps do shell pai em um formato que seja cotado para reentrada segura para o shell. E assim você pode fazer o save_traps , então set sem argumentos - e todos os demais já mencionados - para praticamente obter um bloqueio em todo o estado do shell. Você pode querer adicionar explicitamente export -p e readonly -p para restaurar os atributos var do shell original, no entanto.

De qualquer forma, isso é o suficiente.

    
por 17.06.2015 / 09:14
7

Da página man :

shopt
...With no options, or with the -p option, a list of all settable options is displayed, with an indication of whether or not each is set.
shopt | grep on

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

    
por 17.06.2015 / 09:08
5

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

  1. As opções são 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

    Além disso, as opções (que não possuem 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 são 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 semelhante (mas não igual):

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

    Todas as opções set :

    bash -abefhkmnptuvxBCEHPT
    

    Todas as opções shopt

    bash -O option
    

    Algumas opções que só são significativas quando 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 opções set de uma letra e -ri sã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 bash como um shell de login é relatado apenas com shopt:

-l      Login
read with 'shopt -p login_shell'

Assim:

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

A opção -n nã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 set ou as definidas com shopt são as mesmas shopt . Para listar as opções de configuração:

shopt -o

Qual age exatamente como set -o . Use shopt -po para obter o mesmo resultado que set +o .

Para listar as opções do shopt:

shopt -p

Dos quais você pode optar por imprimir os definidos como shopt -ps ou não definidos shopt -pu

Para obter todas as opções. Por mais que seja 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 definir todas as opções:

$ eval "$storeoptions"
    
por 24.08.2016 / 03:26
3

Para listar todas as opções:

set -o

Para inspecionar uma opção específica:

set -o | grep <OPTION>

Escolha a opção verbose como exemplo:

$ set -o | grep verbose
verbose         off
    
por 23.08.2016 / 20:17
0

Para inspecionar uma opção específica:

if shopt -q <OPTION>
then echo '<OPTION> is set'
fi
    
por 16.07.2017 / 23:18

Tags