Co robi set
polecenie bez argumentów?
Jak widzę, drukuje moje zmienne środowiskowe tak jak env
polecenie, ale w kolejności alfabetycznej. Ponadto drukuje różne informacje (zmienne? Funkcje?), Takie jak:
__git_printf_supports_v=yes
__grub_script_check_program=grub-script-check
...
quote ()
{
local quoted=${1//\'/\'\\\'\'};
printf "'%s'" "$quoted"
}
quote_readline ()
{
local quoted;
_quote_readline_by_ref "$1" ret;
printf %s "$ret"
}
Co to jest i skąd pochodzi?
Nie mogę znaleźć informacji o set
poleceniu bez argumentów. Właściwie nie mam man
strony dla set
mojej dystrybucji Linuksa.
Odpowiedzi:
set
jest wbudowaną powłoką, która wyświetla wszystkie zmienne powłoki, nie tylko środowiskowe, a także funkcje powłoki, co widać na końcu listy.Zmienne są wyświetlane ze składnią, która pozwala na ich ustawienie podczas wykonywania lub pozyskiwania linii.
Ze
bash
strony podręcznika :W różnych powłokach zachowanie niekoniecznie jest takie samo; na przykład
ksh
set
nie wyświetla funkcji powłoki.źródło
ksh
nie przechowuj definicji funkcji w zmiennej powłoki.Ponieważ
set
ma dane wyjściowe iwhich set
nie zwraca nic, o czym wiesz, że jest częścią używanej powłoki, prawdopodobnie bash.man bash wspomina o tym wiele razy, ale łatwiej jest znaleźć link do dokumentacji online .
zestaw ma specyfikację wywołania:
więc jeśli chcesz go znaleźć w wierszu poleceń w wierszu poleceń, możesz wyszukiwać
źródło
which set
zależy od twojej powłoki. Przynajmniejzsh
zgłosi to za ciebie. Możesz również przeczytać to, aby uzyskać więcej informacji.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"
przypiszevar
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
izsh
wsh
,ksh
emulacja nie tylko drukowanie błędu, ale również ustawienie prawidłowych opcji. Podczasyash
ustawiania opcji przystanek na pierwszym nieprawidłową opcję,zsh
przypisze wszystkie z nich. Wyash
:f
ix
zaprezentuje się$-
, podczas gdy:tylko
f
obecny w$-
. W obu przypadkach,f
ix
zaprezentuje się$-
zzsh
wsh
iksh
emulacji.Aby zabezpieczyć się przed tą sytuacją, można przekazać
--
jako pierwszy argument, aby ustawić parametr pozycyjny nawet zaczynać się-
czy+
: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ą rozbrojonex
iv
opcje (opróczposh
) i przypiszą wszystko-
do parametrów pozycyjnych:przypisze
-f
do$1
.set -
również nie rozbroił parametrów pozycji. Schily osh też tak się zachowuje. Heirloom sh nie rozbroićv
ix
opcje.Jedynym wyjątkiem powłoki POSIX jest to
yash
, który traktuje-
jako pierwszy parametr pozycyjny:Schily nawet nie robi nic, jeśli
-
występuje w argumentach:źródło
set -- $unset
,set - $unset
,set $unset
, aset "$unset"
i tak dalej - to zwykle te rozbieżności, które skłonić ludzi do tego rodzaju kłopotów w pierwszej kolejności.$unset
.set $unset
będzie działać dokładnie tak samo, jakset
dla zmiennej nieustawionej. Aleset "$unset"
zwróci uwagę, jeśli wunset
rzeczywistości jest zmienną nieustawioną. Aset - $unset
usuwa-v
i-x
ustaw opcje (w bash).unset_var
. Należy również zauważyć, żeset "$unset"
tak naprawdę jest ustawiony$1
jako pusty. Chodzi o rozszerzenie powłoki, nie tylkoset
, więc nie wspominam o tym.posh
i wyglądająyash
inaczej, gdy się-
pojawią. Możesz przeczytać moją zaktualizowaną wersję (i ją ulepszyć).Jeśli pracujesz w powłoce bash, wpisz
help set
.Na końcu wydrukowanej pomocy przeczytaj:
Zatem argumenty no
set
drukują wszystkie zmienne znane powłoce.źródło
set -x; set
byłby pomocny