Co robi polecenie set bez argumentów?

22

Co robi setpolecenie bez argumentów?

Jak widzę, drukuje moje zmienne środowiskowe tak jak envpolecenie, 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 setpoleceniu bez argumentów. Właściwie nie mam manstrony dla setmojej dystrybucji Linuksa.

Aleksandr Kowalow
źródło
1
„To wbudowane jest tak skomplikowane, że zasługuje na swoją własną sekcję”. Zobacz dokumentację
galath

Odpowiedzi:

17

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 :

Jeśli nie podano żadnych opcji ani argumentów, set wyświetla nazwy i wartości wszystkich zmiennych powłoki i funkcji, posortowane według bieżących ustawień regionalnych, w formacie, który może być ponownie użyty jako dane wejściowe do ustawienia lub zresetowania aktualnie ustawionych zmiennych.

W różnych powłokach zachowanie niekoniecznie jest takie samo; na przykład ksh setnie wyświetla funkcji powłoki.

jlliagre
źródło
3
Jest tak, ponieważ kshnie przechowuj definicji funkcji w zmiennej powłoki.
cuonglm
2
@cuonglm Mądra decyzja projektowa podjęta przez dgk! ;-)
jlliagre
7

Ponieważ setma dane wyjściowe i which setnie 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 .

To wbudowane jest tak skomplikowane, że zasługuje na własną sekcję. set pozwala zmieniać wartości opcji powłoki i ustawiać parametry pozycyjne lub wyświetlać nazwy i wartości zmiennych powłoki.

zestaw ma specyfikację wywołania:

set [--abefhkmnptuvxBCEHPT] [-o option-name] [argument …]
set [+abefhkmnptuvxBCEHPT] [+o option-name] [argument …]

więc jeśli chcesz go znaleźć w wierszu poleceń w wierszu poleceń, możesz wyszukiwać

/set.*abef
użytkownik1133275
źródło
which setzależy od twojej powłoki. Przynajmniej zshzgłosi to za ciebie. Możesz również przeczytać to, aby uzyskać więcej informacji.
cuonglm
Jest mało prawdopodobne, aby pytanie dotyczyło czegoś innego niż bash, ponieważ ma dużą dominację na rynku, a każdy, kto używa powłoki innej niż domyślna, nie musiałby zadawać tego pytania.
user1133275,
6

setjest wbudowaną powłoką używaną do ustawiania i wyłączania opcji powłoki oraz parametrów pozycyjnych.

Bez argumentów setwypisuje 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 varwartość do $1. Jeśli $varzaczynasz od -lub +, wówczas $vartreść była traktowana jako sekwencja opcji powłoki. Jeśli $varzawierają jakiekolwiek nieprawidłowe opcje, większość powłok POSIX wydrukuje błąd. yashi zshw sh, kshemulacja nie tylko drukowanie błędu, ale również ustawienie prawidłowych opcji. Podczas yashustawiania opcji przystanek na pierwszym nieprawidłową opcję, zshprzypisze wszystkie z nich. W yash:

var=-fxd; set "$var"

fi xzaprezentuje się $-, podczas gdy:

var=fdx; set "$var"

tylko fobecny w $-. W obu przypadkach, fi xzaprezentuje się $-z zshw shi kshemulacji.

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 $vardo $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 xi vopcje (oprócz posh) i przypiszą wszystko -do parametrów pozycyjnych:

set -xv - -f

przypisze -fdo $1. set -również nie rozbroił parametrów pozycji. Schily osh też tak się zachowuje. Heirloom sh nie rozbroić vi xopcje.

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
Cuonglm
źródło
Nigdy nie rozumiem, dlaczego ludzie odwołują się do wszędzie, ale pierwszy ... można przytoczyć różnica między set -- $unset, set - $unset, set $unset, a set "$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.
mikeserv
@mikeserv: Cóż, dodałem dalsze szczegóły, ale nie rozumiem, co masz na myśli, gdy jest używany $unset.
cuonglm
@cuonglm Polecenie set $unsetbędzie działać dokładnie tak samo, jak setdla zmiennej nieustawionej. Ale set "$unset" zwróci uwagę, jeśli w unsetrzeczywistości jest zmienną nieustawioną. A set - $unsetusuwa -vi -xustaw opcje (w bash).
@BinaryZebra: Ach, oczywiście, dla mnie, lepiej użyć unset_var. Należy również zauważyć, że set "$unset"tak naprawdę jest ustawiony $1jako pusty. Chodzi o rozszerzenie powłoki, nie tylko set, więc nie wspominam o tym.
cuonglm
1
@mikeserv: Zachowanie poshi wyglądają yashinaczej, gdy się -pojawią. Możesz przeczytać moją zaktualizowaną wersję (i ją ulepszyć).
cuonglm
2

Jeśli pracujesz w powłoce bash, wpisz help set.

Na końcu wydrukowanej pomocy przeczytaj:

Jeśli nie podano żadnych ARG, drukowane są wszystkie zmienne powłoki.

Zatem argumenty no setdrukują wszystkie zmienne znane powłoce.


źródło
Zastanawiam się, czy set -x; setbyłby pomocny
ILMostro_7