Zestaw i Shopt - dlaczego dwa?


72

seti shoptoba są wbudowanymi powłokami, które kontrolują różne opcje. Często zapominam, które opcje są ustawione przez które polecenie, a które opcje ustawia / wyłącza ( set -o/+o, shopt -s/-u). Dlaczego istnieją dwa różne polecenia, które najwyraźniej robią to samo (i mają do tego różne argumenty)? Czy jest jakiś prosty sposób / mnemonik, aby zapamiętać, które opcje pasują do której komendy?


6
Spróbuj spojrzeć na drugą linię help seti help shoptsprawdzić, czy nawet ich autorzy myślą, że robią to samo.
l0b0

2
„Zmień wartość atrybutów powłoki” vs „Zmień ustawienie każdej opcji powłoki”.
Kevin

2
W wydaniu Bash 4.1.5 (1) jest napisane: „Ustaw lub usuń wartości opcji powłoki i parametrów pozycyjnych”. oraz „Ustaw i usuń opcje powłoki.” odpowiednio.
l0b0

Pisanie stron podręcznika sprawia, że ​​zdajesz sobie sprawę z tego, czego nie wiesz, i próbujesz sformułować rzeczy w taki sposób, aby nie pomylić się z tym, o czym próbujesz pisać.
sjas,

Odpowiedzi:


40

O ile mi wiadomo, set -oopcje są dziedziczone z innych powłok w stylu Bourne'a (głównie ksh), a shoptopcje te są specyficzne dla bash. Nie znam żadnej logiki.


1
Czy jakaś dokumentacja shoptjest dziedziczona?
Felipe Alvarez

8
Cóż, są set -oopcje takie jak posix/ physical/ interactive-comments, których nie ma ksh, i shoptte, które są w innych powłokach, w tym kshdla niektórych takich jak login_shell/ nullglob. Jak mówisz, nie ma logiki. Prawdopodobnie na początku był to pomysł (że SHELLOPTS będą standardowymi, a BASHOPTS specyficznymi dla bash), ale po drodze zgubił się, a teraz jest po prostu irytujący i fiaskiem projektowania interfejsu użytkownika.
Stéphane Chazelas,

22

Różnica polega na zmienionej zmiennej środowiskowej używanej przez bash. Ustawienie za pomocą setpolecenia powoduje $SHELLOPTS. Ustawienie za pomocą shoptpolecenia powoduje $BASHOPTS.


9
Ugh! To jest jeszcze bardziej mylące. Mój mózg chce kojarzyć się shoptz $ SH ELL OPT S zamiast $ BA SHOPT S.
Bruno Bronosky


8

Łatwe, ale zagubione w historii. setKomenda została pierwotnie używane do modyfikacji środowiska wiersza poleceń oryginalnych powłok uniksowych /bin/sh. Potem, gdy ewoluowały różne wersje Uniksa i dodano nowe smaki powłoki, ludzie zdali sobie sprawę, że muszą być w stanie zmienić więcej (środowiska) rzeczy, aby zachować zgodność skryptów powłoki. W tym czasie Bash dostał bardzo popularne i dodatkowe sh ELL opt było potrzebne jony, wprowadzenie shopt.

Rzeczywiście można zobaczyć te COMPAT prób ibility w shoptpoleceniu.

$ shopt
autocd          off
cdable_vars     off
cdspell         off
checkhash       off
checkjobs       off
checkwinsize    off
cmdhist         on
compat31        off
compat32        off
compat40        off
compat41        off
compat42        off
complete_fullquote      on
direxpand       off
dirspell        off
dotglob         off
execfail        off
expand_aliases  on
extdebug        off
extglob         off
extquote        on
failglob        off
force_fignore   on
globstar        off
globasciiranges off
gnu_errfmt      off
histappend      on
histreedit      off
histverify      off
hostcomplete    on
huponexit       off
interactive_comments    on
lastpipe        off
lithist         off
login_shell     on
mailwarn        off
no_empty_cmd_completion off
nocaseglob      on
nocasematch     off
nullglob        off
progcomp        on
promptvars      on
restricted_shell        off
shift_verbose   off
sourcepath      on
xpg_echo        off

Ale nie w setpoleceniu.

$ set -o
allexport       off
braceexpand     on
emacs           on
errexit         off
errtrace        off
functrace       off
hashall         on
histexpand      on
history         on
igncr           off
ignoreeof       off
interactive-comments    on
keyword         off
monitor         on
noclobber       off
noexec          off
noglob          off
nolog           off
notify          off
nounset         off
onecmd          off
physical        off
pipefail        off
posix           off
privileged      off
verbose         off
vi              off
xtrace          off

2
setponieważ sposobem ustawiania opcji nie było w oryginalnych powłokach uniksowych, została wprowadzona przez powłokę Bourne'a pod koniec lat 70. set -o namesam został później dodany przez powłokę Korna, określoną, ale opcjonalną w POSIX, wciąż nieobsługiwaną przez „nowoczesne” wersje powłoki Bourne'a, takie jak /bin/shSolaris 10.
Stéphane Chazelas

5

Z książki „Linux Shell Scripting with Bash”, s. 63:

Historycznie setpolecenie służyło do włączania i wyłączania opcji. Gdy liczba opcji rosła, korzystanie z niej setstało się trudniejsze, ponieważ opcje są reprezentowane przez kody jednoliterowe. W rezultacie Bash udostępnia polecenie shopt( opcja powłoki ), aby włączać i wyłączać opcje według nazwy zamiast litery. Możesz ustawić niektóre opcje tylko listem. Inne są dostępne tylko pod shoptpoleceniem. To sprawia, że ​​znalezienie i ustawienie określonej opcji jest mylącym zadaniem.


3

Wygląda na to, że opcje „set” są dziedziczone przez podpowłoki, a shopts nie.


Dobry chwyt. Zastanawiam się, czy jest to celowy wybór, czy efekt uboczny.
Kevin

2
@ user29778 Przynajmniej w wersji bash 4.1.5 (1) ustawione opcje setnie są dziedziczone przez podpowłoki. Obie seti shoptopcje nie są dziedziczone przez podpowłoki.
Martin

Czy możesz wskazać dokumentację opisującą cechy dziedziczenia zarówno, jak seti shopt?
Felipe Alvarez

9
Zarówno set -oi shoptopcje są dziedziczone przez podpowłok ( (...), $(...), elementów rurociągów). To, czy odziedziczą je inne bashwywołania, zależy od tego, SHELLOPTSczy BASHOPTSznajdują się w środowisku, czy nie.
Stéphane Chazelas,

0

setpochodzi z powłoki Bourne'a (sh) i jest częścią standardu POSIX, shoptjednak nie jest i jest specyficzna dla powłoki Bourne'a (bash):

0 sjas@ssg 14:31:45 ~  
set | grep -e SHELLOPTS -e BASHOPTS
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:dotglob:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor

0 sjas@ssg 14:31:51 ~  
shopt | column -t | grep -v off
checkwinsize             on
cmdhist                  on
complete_fullquote       on
dotglob                  on
expand_aliases           on
extglob                  on
extquote                 on
force_fignore            on
histappend               on
interactive_comments     on
progcomp                 on
promptvars               on
sourcepath               on

0 sjas@ssg 14:31:57 ~  
set -o | column -t | grep -v off
braceexpand           on
emacs                 on
hashall               on
histexpand            on
history               on
interactive-comments  on
monitor               on

0 sjas@ssg 14:37:41 ~ 
sh 

$ set -o
Current option settings
errexit         off
noglob          off
ignoreeof       off
interactive     on
monitor         on
noexec          off
stdin           on
xtrace          off
verbose         off
vi              off
emacs           off
noclobber       off
allexport       off
notify          off
nounset         off
priv            off
nolog           off
debug           off

$ shopt
sh: 3: shopt: not found

$ 
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.