¿Cómo puedo enumerar las opciones de bash'es para el shell actual?

27

El intérprete bash en sí tiene opciones, es decir

Líneas 22-23 de la página de manual de 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 ...  

He utilizado algunos patrones de búsqueda en bash man page como:

  • /^\s*set
  • /list

¿Es posible imprimir una lista de estas configuraciones que se aplican al shell actual?

the_velour_fog
fuente

Respuestas:

26
printf %s\\n "$-"

Enumerará las opciones de letra única en una sola cadena.

Ese parámetro también se puede usar como:

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

Para deshabilitar -fprimero la expansión de nombre de archivo de shell al mismo tiempo que guarda un valor para $-, si lo hay, en $1. A continuación, no se producen globs, y la última +fexpansión de ilename vuelve a estar habilitada y posiblemente también deshabilitada.

Por ejemplo, si la -fexpansión de nombre de archivo ya estaba deshabilitada cuando $-se guardó por primera vez el valor , entonces su valor guardado sería (al menos) :

f

Y así, cuando setse ejecuta de nuevo, funciona para:

set +f -f

Lo que simplemente te devuelve a donde empezaste.

set +o

Enumerará todas setlas opciones de shell de la tabla (consulte la respuesta de Jason para las shoptopciones de ¿es una palabra?) En una forma segura para el reingreso de shell. De esa manera, también puedes hacer:

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

Para guardar, cambiar y restaurar el estado de las opciones de shell respectivamente.

Para manejar shoptiones y setopciones de tabla de una vez:

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

También puede llamar set sin ningún argumento para agregar una lista de todas las variables establecidas actualmente en el shell, también citadas para volver a ingresar al shell. Y puede, en bash, agregar adicionalmente el comando typeset -fppara incluir también todas las funciones de shell declaradas actualmente. Puede agruparlo todo junto y evalcuando esté listo. Incluso puede llamar aliassin argumentos para más de lo mismo. Eso ... podría cubrirlo, sin embargo. Supongo que sí "$@", lo cual tendrías que poner bashprimero en una matriz, supongo, antes de hacerlo set.

No, también hay trap. Este es un poco divertido. Generalmente:

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

... solo imprimirá esta es mi subshell porque la subshell es un proceso nuevo y obtiene su propio conjunto de traps, por lo que no hereda ninguna traps sino aquellas que su padre ha ignorado explícitamente (como trap '' INT) .

Sin embargo:

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

trapse comporta especialmente cuando es el primer y único comando ejecutado en un subshell de sustitución de comandos en el sentido de que reproducirá una lista del shell primario actualmente configurado trapsen un formato que se cita para un reingreso seguro al shell. Y para que pueda hacer eso save_traps, luego set sin argumentos, y todo el resto ya mencionado, para obtener un bloqueo en todo el estado de shell. Sin embargo, es posible que desee agregar explícitamente export -py readonly -prestaurar los atributos var de shell originales.

De todos modos, eso es suficiente.

mikeserv
fuente
gracias, tu código funciona bien. así que para obtener una lista completa de todas las opciones, tendrías que usar ambas set +o y shopt ? (en cuanto a shoptser una palabra, settablese usa en la página de manual, así que shoptablefunciona para mí)
the_velour_fog
@ user4668401 - Creo que eso lo hará.
mikeserv
TL; DR, pero +1000 para la solución de 3 líneas para cambiar una opción y volver a ponerla 'como estaba'. Eso es exactamente lo que uno necesita al crear scripts o copiar / pegar instrucciones.
Balmipour
@mikeserv Parece que la opción -p debe agregarse al guardar el estado para incluir shoptiones, es decirstate=$(set +o;shopt -p)
nkatsar
9

De la manpágina:

shopt
... Sin opciones, o con la opción -p, se muestra una lista de todas las opciones configurables, con una indicación de si cada una está configurada o no.
shopt | grep on

imprimirá una lista de todas las opciones habilitadas.

jasonwryan
fuente
Eso funcionó, gracias. ¿Sabe si esto enumera las opciones configurables por ambos sety shopt?
the_velour_fog
@ user4668401 No, setes mucho más extenso: consulte la entrada de la página de manual .
jasonwryan
Y para comprobar si una sola opción está activada:shopt <option>
kos
esto incluirá opciones con 'on' en el nombre (es decir huponexit). forma sencilla de arreglar esshopt | grep on$
Mike D
6

Para enumerar todas las opciones:

set -o

Para inspeccionar una opción específica:

set -o | grep <OPTION>

Tome la opción verbosecomo ejemplo:

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

¿Opciones ?: Hay tres grupos de opciones en bash.

  1. Las opciones leídas o establecidas por el comando set.
    (Utilizar este comando para el manual: LESS=+/'set \[--abefhkmnptuvxBCEHPT\]' man bash)
    Todas las opciones de una letra:abefhkmnptuvxBCEHPT

    También las opciones (que no tienen una 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. Las opciones leídas o establecidas por el comando shopt.
    (Lea el manual con este comando: LESS=+/'shopt \[-pqsu\]' man bash')
    La lista es bastante larga pero fácil de imprimir, utilice:

    $ shopt -p

    o similar (pero no igual):

    $ shopt
  3. Las opciones que se podrían establecer en invocación:
    (comandos para el manual: LESS=+/'^INVOCATION' man bash)

    Todas las setopciones:

    bash -abefhkmnptuvxBCEHPT

    Todas las shoptopciones

    bash -O option

    Algunas opciones que solo son significativas al invocar bash:

    bash -lirsDc

    Y, también (opciones largas):

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

Todas las setopciones de una letra y -rise imprimen con $-.

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

Por ejemplo:

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

Llamar a bash como un shell de inicio de sesión solo se informa con shopt:

-l      Login
read with `shopt -p login_shell`

Así:

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

La opción -nno puede ser probada por ningún código, ya que significa: no ejecute ningún código.


Opciones de impresión

La mejor herramienta para enumerar las opciones del shell en ejecución , ya sea las que están configuradas seto las que están configuradas, shoptes la misma shopt. Para enumerar las opciones establecidas:

shopt -o

Que actúa exactamente como set -o. Use shopt -popara obtener el mismo resultado que set +o.

Para enumerar las opciones de compras:

shopt -p

De los cuales puede elegir imprimir los que están configurados shopt -pso noshopt -pu

Para obtener todas las opciones. Tanto como sea posible, muchas opciones largas y algunos ( -sDc) en INVOCATION no se pueden imprimir:

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

Para almacenarlos en una variable:

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

Y la variable podría usarse para retrasar todas las opciones:

$ eval "$storeoptions"

fuente
1

Para inspeccionar una opción específica:

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