Set and Shopt – dlaczego dwa?

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

  • Spójrz na drugą linię i help shopt, aby sprawdzić, czy nawet ich autorzy uważają, że robią to samo.
  • " Zmień wartość atrybutów powłoki " vs " Zmień ustawienia każdej opcji powłoki ".
  • W Bash 4.1.5 (1) -release mówi " Ustawia lub kasuje wartości opcji powłoki i parametrów pozycyjnych. " i " Ustaw i wyłącz opcje powłoki. Odpowiednio ".
  • Pisanie manpages uświadamia ci to, czego nie wiesz, i sprawia, że próbujesz sformułować rzeczy w sposób, w jaki nie mylisz się w tym, o czym próbujesz pisać.

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 jak posix / physical / interactive-comments, których nie ma w ksh i shopt, które są w innych powłoki, w tym ksh dla niektórych, takich jak login_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ź

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. Sam set -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 opcji set stało się trudniejsze w użyciu, ponieważ opcje są reprezentowane przez kody jednoliterowe. W rezultacie Bash udostępnia polecenie shopt ( 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ą polecenia shopt. 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ówno set, jak i shopt opcje nie są dziedziczone przez podpowłoki.
  • Czy możesz wskazać dokumentację opisującą cechy dziedziczenia zarówno set, jak i shopt?
  • Oba set -o i shopt opcje są dziedziczone przez podpowłoki ((...), $(...), komponenty rurociągów). To, czy są dziedziczone przez inne wywołania bash, zależy od tego, czy SHELLOPTS czy BASHOPTS 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 $ 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *