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' -f
espansione del nome shell mentre contemporaneamente si salva un valore per $-
- se presente - in $1
. Successivamente, non si verificano +f
globs e l' espansione dell'ultimo ilename viene nuovamente abilitata, e possibilmente anche disabilitata.
Ad esempio, se -f
l'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 set
viene eseguito di nuovo, funziona:
set +f -f
Il che ti riporta proprio dove hai iniziato.
set +o
Elencherà tutte set
le 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 shopt
ioni e le set
opzioni 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 -fp
per includere anche tutte le funzioni di shell attualmente dichiarate. Puoi raggruppare tutto insieme e eval
quando sei pronto. Puoi anche chiamare alias
senza argomenti per più o meno lo stesso. Quello ... potrebbe coprirlo, comunque. Immagino che ci sia "$@"
- che dovresti mettere in un bash
array 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 trap
s - e quindi non eredita alcun trap
s ma quelli che il suo genitore ha esplicitamente ignorato - (come trap '' INT
) .
Tuttavia:
trap 'echo this is my trap' 0
save_traps=$(trap)
trap
si 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 traps
in 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 -p
e readonly -p
ripristinare esplicitamente gli attributi var della shell originale.
Comunque, è abbastanza.
set +o
eshopt
? (quanto ashopt
poter essere una parola,settable
viene usato nella pagina man, quindishoptable
funziona per me)