set
è una shell incorporata , utilizzata per impostare e disinserire opzioni di shell e parametri posizionali.
Senza argomenti, set
verranno stampate tutte le variabili shell (sia variabili d'ambiente che variabili nella sessione corrente) ordinate nella locale corrente .
Puoi anche leggere la documentazione di bash .
Ci sono alcuni avvertimenti.
set "$var"
assegnerà var
valore a $1
. Se $var
inizia con -
o +
, il $var
contenuto è stato trattato come una sequenza di opzioni di shell. Se $var
contengono opzioni non valide, la maggior parte delle shell POSIX stamperà l'errore. yash
e zsh
in sh
, l' ksh
emulazione non solo stampa l'errore, ma imposta anche opzioni valide. Mentre yash
interrompi l'impostazione delle opzioni sulla prima opzione non valida, zsh
le assegnerai tutte. In yash
:
var=-fxd; set "$var"
f
e x
presenterà $-
, mentre:
var=fdx; set "$var"
f
presente solo in $-
. In entrambi i casi, f
e x
si presenterà $-
con zsh
in sh
ed ksh
emulazione.
Per proteggerti da quella situazione, puoi passare --
come primo argomento per impostare il parametro posizionale anche se inizia con -
o +
:
var=-fdx; set -- "$var"
assegnerà $var
a $1
, indipendentemente dal suo contenuto.
set --
senza ulteriori argomenti disinserirà tutti i parametri posizionali.
Se il primo argomento è -
, il comportamento non è specificato. Tutte le shell POSIX note verranno disattivate x
e le v
opzioni (tranne posh
) e assegneranno qualsiasi cosa dopo -
ai parametri posizionali:
set -xv - -f
assegnerà -f
a $1
. set -
inoltre non ha annullato i parametri posizionali. Anche Schily osh si comporta così. Heirloom sh non viene disattivato v
e le x
opzioni.
L'unica eccezione alla shell POSIX è yash
, che considera -
il primo parametro posizionale:
$ yash -c 'set -xv - -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
+ printf %s\n - -f
-
-f
+ printf %s\n cvx
cvx
Schily sh non fa nulla se -
presente negli argomenti:
$ schily-sh -c 'set -v - -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
<blank line>
s
$ schily-sh -c 'set -v -- -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
-f
vs