Come posso elencare le opzioni di base per la shell corrente?


27

L'intero bash stesso ha opzioni, ad es

Linee 22-23 della pagina man di 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 ...  

Ho usato alcuni schemi di ricerca nella pagina man di bash come:

  • /^\s*set
  • /list

È possibile stampare un elenco di queste impostazioni applicate alla shell corrente?

Risposte:


26
printf %s\\n "$-"

Elencherà le opzioni a lettera singola in un'unica stringa.

Quel parametro può anche essere usato come:

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

Per prima cosa disabilitare l' -fespansione del nome shell mentre contemporaneamente si salva un valore per $-- se presente - in $1. Successivamente, non si verificano +fglobs e l' espansione dell'ultimo ilename viene nuovamente abilitata, e possibilmente anche disabilitata.

Ad esempio, se -fl'espansione ilename era già disabilitata quando il valore per è $-stato salvato per la prima volta, il suo valore salvato sarebbe (almeno) :

f

E così quando setviene eseguito di nuovo, funziona:

set +f -f

Il che ti riporta proprio dove hai iniziato.

set +o

Elencherà tutte setle opzioni della shell della tabella (vedi la risposta di Jason per leshopt opzioni capaci - è una parola? -) in una forma sicura per il rientro della shell. In questo modo, puoi anche fare:

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

Per salvare, modificare e ripristinare rispettivamente lo stato delle opzioni della shell.

Per gestire gli shoptioni e le setopzioni della tabella in una sola volta:

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

È inoltre possibile chiamare set senza alcun argomento per aggiungere un elenco di tutte le variabili attualmente impostate della shell, citate anche per il rientro nella shell. E puoi - in bash - aggiungere inoltre il comando typeset -fpper includere anche tutte le funzioni di shell attualmente dichiarate. Puoi raggruppare tutto insieme e evalquando sei pronto. Puoi anche chiamare aliassenza argomenti per più o meno lo stesso. Quello ... potrebbe coprirlo, comunque. Immagino che ci sia "$@"- che dovresti mettere in un basharray prima, suppongo, prima di farlo set.

No, c'è anche trap. Questo è un po 'divertente. Generalmente:

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

... stamperò solo questa è la mia subshell perché la subshell è un nuovo processo e ottiene il suo set di traps - e quindi non eredita alcun traps ma quelli che il suo genitore ha esplicitamente ignorato - (come trap '' INT) .

Tuttavia:

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

trapsi comporta in modo particolare quando si tratta del primo e unico comando eseguito in una subshell di sostituzione comandi in quanto riprodurrà un elenco della shell padre attualmente impostato trapsin un formato quotato per un rientro sicuro nella shell. E così puoi fare save_traps, quindi set senza argomenti - e tutto il resto già menzionato - per ottenere praticamente un blocco su tutto lo stato della shell. Tuttavia, potresti voler aggiungere export -pe readonly -pripristinare esplicitamente gli attributi var della shell originale.

Comunque, è abbastanza.


grazie, il tuo codice funziona bene. quindi per ottenere un elenco completo di tutte le opzioni, dovresti usare entrambi set +o e shopt ? (quanto a shoptpoter essere una parola, settableviene usato nella pagina man, quindi shoptablefunziona per me)
the_velour_fog

@ user4668401 - Penso che lo farà.
Mikeserv,

TL; DR, ma +1000 per la soluzione a 3 righe per modificare un'opzione e rimetterla "com'era". Questo è esattamente ciò di cui si ha bisogno durante la creazione di script o istruzioni di copia / pastable.
Balmipour,

@mikeserv Sembra che l' opzione -p debba essere aggiunta quando si salva lo stato per includere gli shoptioni, cioèstate=$(set +o;shopt -p)
nkatsar

9

Dalla manpagina:

shopt
... Senza opzioni o con l'opzione -p, viene visualizzato un elenco di tutte le opzioni impostabili, con l'indicazione se ciascuna è impostata o meno.
shopt | grep on

stamperà un elenco di tutte le opzioni abilitate.


ha funzionato, grazie. Sai se questo elenca le opzioni che possono essere impostate da entrambi sete shopt?
the_velour_fog

@ user4668401 No, setè molto più esteso: vedi la voce della pagina man .
Jasonwryan,

E per verificare se è attiva un'unica opzione:shopt <option>
kos

questo includerà le opzioni con 'on' nel nome (cioè huponexit). un modo semplice per risolvere èshopt | grep on$
Mike D

6

Per elencare tutte le opzioni:

set -o

Per ispezionare un'opzione specifica:

set -o | grep <OPTION>

Prendi l'opzione verbosecome esempio:

$ set -o | grep verbose
verbose         off

6

Opzioni ?: Ci sono tre gruppi di opzioni in bash.

  1. Le opzioni lette o impostate dal comando set.
    (Utilizzare questo comando per il manuale: LESS=+/'set \[--abefhkmnptuvxBCEHPT\]' man bash)
    Tutte le opzioni a una lettera:abefhkmnptuvxBCEHPT

    Anche le opzioni (che non hanno un equivalente di una sola lettera):

    set -o emacs
    set -o history
    set -o ignoreeof
    set -o interactive-comments
    set -o pipefail
    set -o posix
    set -o vi
  2. Le opzioni lette o impostate dal comando shopt.
    (Leggere il manuale con questo comando: LESS=+/'shopt \[-pqsu\]' man bash')
    La lista è abbastanza lunga ma facile da stampare, utilizzare:

    $ shopt -p

    o simili (ma non uguali):

    $ shopt
  3. Le opzioni che potrebbero essere impostate su invocazione:
    (comando per il manuale: LESS=+/'^INVOCATION' man bash)

    Tutte le setopzioni:

    bash -abefhkmnptuvxBCEHPT

    Tutte le shoptopzioni

    bash -O option

    Alcune opzioni che sono significative solo quando INVOKING bash:

    bash -lirsDc

    E anche (opzioni lunghe):

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

Tutte le setopzioni di una lettera e -risono stampate con $-.

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

Per esempio:

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

Chiamare bash come shell di login è segnalato solo con shopt:

-l      Login
read with `shopt -p login_shell`

Così:

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

L'opzione -nnon può essere testata da nessun codice, in quanto significa: non eseguire alcun codice.


Opzioni di stampa

Lo strumento migliore per elencare le opzioni della shell in esecuzione , sia quelle impostate con setche quelle impostate, shoptè lo stesso shopt. Per elencare le opzioni impostate:

shopt -o

Che agisce esattamente come set -o. Utilizzare shopt -poper ottenere lo stesso risultato di set +o.

Per elencare le opzioni shopt:

shopt -p

Di cui è possibile scegliere di stampare quelli impostati shopt -pso non impostatishopt -pu

Per ottenere tutte le opzioni. Per quanto è possibile quante opzioni lunghe e alcune ( -sDc) su INVOCATION non possono essere stampate:

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

Per memorizzarli in una variabile:

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

E la variabile potrebbe essere utilizzata per ripristinare tutte le opzioni:

$ eval "$storeoptions"

1

Per ispezionare un'opzione specifica:

if shopt -q <OPTION>
then echo '<OPTION> is set'
fi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.