set
i shopt
oba 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?
72
help set
ihelp shopt
sprawdzić, czy nawet ich autorzy myślą, że robią to samo.Odpowiedzi:
O ile mi wiadomo,
set -o
opcje są dziedziczone z innych powłok w stylu Bourne'a (głównie ksh), ashopt
opcje te są specyficzne dla bash. Nie znam żadnej logiki.źródło
shopt
jest dziedziczona?set -o
opcje takie jakposix
/physical
/interactive-comments
, których nie maksh
, ishopt
te, które są w innych powłokach, w tymksh
dla niektórych takich jaklogin_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.Różnica polega na zmienionej zmiennej środowiskowej używanej przez bash. Ustawienie za pomocą
set
polecenia powoduje$SHELLOPTS
. Ustawienie za pomocąshopt
polecenia powoduje$BASHOPTS
.źródło
shopt
z $ SH ELL OPT S zamiast $ BA SHOPT S.set
jest POSIX 7: ustaw - ustaw lub usuń opcje i parametry pozycyjne | pubs.opengroup.orgshopt
nie jest: Shell & Utilities: Szczegółowe Toc | pubs.opengroup.orgPrawdopodobnie związany z historią wspomnianą przez @Gilles.
źródło
Łatwe, ale zagubione w historii.
set
Komenda 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, wprowadzenieshopt
.Rzeczywiście można zobaczyć te COMPAT prób ibility w
shopt
poleceniu.Ale nie w
set
poleceniu.źródło
set
ponieważ 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 name
sam 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/sh
Solaris 10.Z książki „Linux Shell Scripting with Bash”, s. 63:
źródło
Wygląda na to, że opcje „set” są dziedziczone przez podpowłoki, a shopts nie.
źródło
set
nie są dziedziczone przez podpowłoki. Obieset
ishopt
opcje nie są dziedziczone przez podpowłoki.set
ishopt
?set -o
ishopt
opcje są dziedziczone przez podpowłok ((...)
,$(...)
, elementów rurociągów). To, czy odziedziczą je innebash
wywołania, zależy od tego,SHELLOPTS
czyBASHOPTS
znajdują się w środowisku, czy nie.set
pochodzi z powłoki Bourne'a (sh) i jest częścią standardu POSIX,shopt
jednak nie jest i jest specyficzna dla powłoki Bourne'a (bash):źródło