set
jest wbudowaną powłoką używaną do ustawiania i wyłączania opcji powłoki oraz parametrów pozycyjnych.
Bez argumentów set
wypisuje wszystkie zmienne powłoki (zarówno zmienne środowiskowe, jak i zmienne w bieżącej sesji) posortowane według bieżących ustawień regionalnych .
Możesz także przeczytać dokumentację bash .
Jest kilka ostrzeżeń.
set "$var"
przypisze var
wartość do $1
. Jeśli $var
zaczynasz od -
lub +
, wówczas $var
treść była traktowana jako sekwencja opcji powłoki. Jeśli $var
zawierają jakiekolwiek nieprawidłowe opcje, większość powłok POSIX wydrukuje błąd. yash
i zsh
w sh
, ksh
emulacja nie tylko drukowanie błędu, ale również ustawienie prawidłowych opcji. Podczas yash
ustawiania opcji przystanek na pierwszym nieprawidłową opcję, zsh
przypisze wszystkie z nich. W yash
:
var=-fxd; set "$var"
f
i x
zaprezentuje się $-
, podczas gdy:
var=fdx; set "$var"
tylko f
obecny w $-
. W obu przypadkach, f
i x
zaprezentuje się $-
z zsh
w sh
i ksh
emulacji.
Aby zabezpieczyć się przed tą sytuacją, można przekazać --
jako pierwszy argument, aby ustawić parametr pozycyjny nawet zaczynać się -
czy +
:
var=-fdx; set -- "$var"
przypisze $var
do $1
, niezależnie od jego zawartości.
set --
bez dalszych argumentów spowoduje rozbrojenie wszystkich parametrów pozycyjnych.
Jeśli pierwszym argumentem jest -
, zachowanie jest nieokreślone. Wszystkie znane powłoki POSIX zostaną rozbrojone x
i v
opcje (oprócz posh
) i przypiszą wszystko -
do parametrów pozycyjnych:
set -xv - -f
przypisze -f
do $1
. set -
również nie rozbroił parametrów pozycji. Schily osh też tak się zachowuje. Heirloom sh nie rozbroić v
i x
opcje.
Jedynym wyjątkiem powłoki POSIX jest to yash
, który traktuje -
jako pierwszy parametr pozycyjny:
$ yash -c 'set -xv - -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
+ printf %s\n - -f
-
-f
+ printf %s\n cvx
cvx
Schily nawet nie robi nic, jeśli -
występuje w argumentach:
$ 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