set
i shopt
to elementy wbudowane powłoki, które kontrolują różne opcje. Często zapominam, które opcje są ustawiane przez które polecenie, a która ustawia / kasuje (set -o/+o
, shopt -s/-u
). Dlaczego istnieją dwa różne polecenia, które pozornie robią to samo (i mają różne argumenty)? Czy istnieje łatwy sposób / mnemonik, aby zapamiętać, które opcje są powiązane z danym poleceniem?
Komentarze
Odpowiedz
O ile wiem, są dziedziczone z innych powłok w stylu Bournea (głównie ksh), a opcje shopt
są specyficzne dla basha. Nie ma żadnej logiki, o której wiem.
Komentarze
- Każda dokumentacja, która pokazuje
shopt
jest dziedziczone? - Cóż, istnieją opcje
set -o
, takie jakposix
/physical
/interactive-comments
, których nie ma wksh
ishopt
, które są w innych powłoki, w tymksh
dla niektórych, takich jaklogin_shell
/nullglob
. Jak mówisz, ' nie ma logiki. Prawdopodobnie był to pomysł na początku (że SHELLOPTS byłyby standardowymi, a BASHOPTS dotyczyło bash), ale zgubił się po drodze, a teraz kończy się to po prostu irytującym i fiaskiem projektowania interfejsu użytkownika.
Odpowiedź
Różnica polega na zmienionej zmiennej środowiskowej używany przez basha. Ustawienie za pomocą polecenia set
skutkuje . Ustawienie za pomocą polecenia shopt
skutkuje $BASHOPTS
.
Komentarze
- Fuj! To jest jeszcze bardziej zagmatwane. Mój mózg chce skojarzyć
shopt
z $ SH ELL OPT S, a nie $ BA SHOPT S .
Odpowiedź
-
set
to POSIX 7: set – ustawianie lub wyłączanie opcji i parametrów pozycyjnych | pubs.opengroup.org -
shopt
to nie: Shell & Narzędzia: Szczegółowa lista | pubs.opengroup.org
Prawdopodobnie powiązany z historią wspomnianą przez @Gilles.
Odpowiedź
Łatwe, ale zagubione w historii. Polecenie set
było pierwotnie używane do modyfikowania środowiska wiersza poleceń oryginalnych powłok unixa /bin/sh
. Następnie, gdy ewoluowały różne wersje Uniksa i dodawano nowe smaki powłoki, ludzie zdali sobie sprawę, że muszą mieć możliwość zmiany większej liczby rzeczy (środowiska), aby zachować zgodność skryptów powłoki. W tym czasie Bash stał się bardzo popularny, a dodatkowa sh ell opt jony były potrzebne, wprowadzając shopt
.
W rzeczywistości możesz zobaczyć te compliance próby poprawności w poleceniu shopt
.
$ 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 poleceniu set
.
$ 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
Komentarze
-
set
jako sposób ustawiania opcji nie był ' t w oryginalnych powłokach Uniksa, został wprowadzony przez powłokę Bournea pod koniec lat 70. Samset -o name
został dodany później przez powłokę Korna, określony, ale opcjonalny w POSIX, nadal nie jest obsługiwany przez " nowoczesny " wersje powłoki Bourne, takie jak/bin/sh
systemu Solaris 10.
Odpowiedź
Z książki „Linux Shell Scripting with Bash”, str. 63:
W przeszłości polecenie
set
było używane do włączania i wyłączania opcji. Wraz ze wzrostem liczby opcjiset
stało się trudniejsze w użyciu, ponieważ opcje są reprezentowane przez kody jednoliterowe. W rezultacie Bash udostępnia polecenieshopt
( opcja powłoki ) do włączania i wyłączania opcji według nazwy zamiast litery. Niektóre opcje można ustawić tylko listownie. Inne są dostępne tylko za pomocą poleceniashopt
. To sprawia, że znalezienie i ustawienie określonej opcji jest skomplikowanym zadaniem.
Odpowiedź
Wygląda na to, że opcje „set” są dziedziczone przez podpowłoki a sklepy nie.
Komentarze
- Niezły chwyt. Zastanawiam się, czy jest to celowy wybór, czy efekt uboczny.
- @ user29778 Przynajmniej pod bash 4.1.5 (1) opcjami ustawionymi za pomocą
set
nie są dziedziczone przez podpowłoki. Zarównoset
, jak ishopt
opcje nie są dziedziczone przez podpowłoki. - Czy możesz wskazać dokumentację opisującą cechy dziedziczenia zarówno
set
, jak ishopt
? - Oba
set -o
ishopt
opcje są dziedziczone przez podpowłoki ((...)
,$(...)
, komponenty rurociągów). To, czy są dziedziczone przez inne wywołaniabash
, zależy od tego, czySHELLOPTS
czyBASHOPTS
znajdują się w czy nie.
Odpowiedź
set
pochodzi z Bourne shell (sh) i jest częścią standardu POSIX, shopt
nie jest jednak i jest specyficzna dla powłoki Bourne-again (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 $
help shopt
, aby sprawdzić, czy nawet ich autorzy uważają, że robią to samo.