Set and Shopt – De ce doi?

set și shopt sunt ambele componente încorporate care controlează diverse Opțiuni. De multe ori uit ce opțiuni sunt setate prin ce comandă și ce opțiune setează / anulează (set -o/+o, shopt -s/-u). De ce există două comenzi diferite care aparent fac același lucru (și au argumente diferite pentru a face acest lucru)? Există vreo modalitate ușoară / mnemonică de a vă aminti care sunt opțiunile cu care comandă?

Comentarii

  • Încercați să vă uitați la a doua linie a help set și help shopt pentru a verifica dacă chiar și autorii lor cred că fac același lucru.
  • " Modificați valoarea atributelor shell " vs " Modificați setarea fiecărei opțiuni shell ".
  • În Bash 4.1.5 (1) -release scrie " Setați sau anulați valorile opțiunilor shell și ale parametrilor de poziție. " și " Setați și anulați opțiunile shell. ", respectiv.
  • Scriere paginile de manual vă fac să vă dați seama de ceea ce nu știți și vă face să încercați să formulați lucruri într-un mod în care nu sunteți greșit în legătură cu ceea ce încercați să scrieți. = „answer”>

    Din câte știu eu, sunt cele care sunt moștenite de la alte cochilii în stil Bourne (în principal ksh), iar opțiunile shopt sunt cele care sunt specifice bash-ului. Nu există nicio logică pe care să o cunosc.

    Comentarii

    • Orice documentație care arată shopt este moștenit?
    • Ei bine, există set -o opțiuni precum posix / physical / interactive-comments care nu se află în ksh și shopt care se află în alte cochilii, inclusiv ksh pentru unii ca login_shell / nullglob. Cum spui tu, există ' nu are logică. Probabil a fost ideea de la început (că SHELLOPTS ar fi cele standard și BASHOPTS cele specifice bash), dar care s-a pierdut pe parcurs, iar acum doar ajunge să fie enervant și un fiasco de proiectare a interfeței de utilizare.

Răspuns

Diferența este în variabila de mediu modificată utilizat de bash. Setarea cu comanda set are ca rezultat . Setarea cu comanda shopt are ca rezultat $BASHOPTS.

Comentarii

  • Uf! Acest lucru este și mai confuz. Creierul meu vrea să asocieze shopt cu $ SH ELL OPT S mai degrabă decât $ BA SHOPT S .

Răspuns

Răspuns

Ușor, dar pierdut în istorie. Comanda set a fost inițial utilizată pentru a modifica mediul din linia de comandă a shell-urilor unix originale /bin/sh. Apoi, pe măsură ce diferite versiuni Unix au evoluat și au fost adăugate noi arome de shell, oamenii și-au dat seama că trebuie să poată schimba mai multe lucruri (de mediu) pentru a păstra compatibilitatea scripturilor de shell. În acel moment Bash a devenit foarte popular și opțiunea sh ell opt a fost nevoie de ioni, introducând shopt.

De fapt, puteți vedea acești compat încercări de ibilitate în comanda 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 

Dar nu în comanda 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 

Comentarii

  • set ca modalitate de setare a opțiunilor wasn ' t în shell-urile originale Unix, a fost introdus de shell-ul Bourne la sfârșitul anilor 70. set -o name a fost adăugat ulterior de shell-ul Korn, specificat dar opțional în POSIX, totuși neacceptat de " modern " versiuni ale shell-ului Bourne precum /bin/sh din Solaris 10.

Răspuns

Din cartea „Linux Shell Scripting with Bash”, p 63:

Din punct de vedere istoric, comanda set a fost utilizată pentru a activa și dezactiva opțiunile. Pe măsură ce numărul de opțiuni a crescut, set a devenit mai dificil de utilizat, deoarece opțiunile sunt reprezentate de coduri cu o singură literă. Ca rezultat, Bash oferă comanda shopt ( shell option ) pentru a activa și dezactiva opțiunile după nume în loc de literă. Puteți seta anumite opțiuni numai prin scrisoare. Altele sunt disponibile numai sub comanda shopt. Acest lucru face din găsirea și setarea unei anumite opțiuni o sarcină confuză.

Răspuns

Se pare că opțiunile „set” sunt moștenite de sub-shell-uri iar magazinele nu sunt.

Comentarii

  • Captură frumoasă. Mă întreb dacă aceasta este o alegere intenționată sau un efect secundar.
  • @ user29778 Cel puțin sub bash 4.1.5 (1) opțiunile setate cu set nu sunt moștenite de subshells. Atât opțiunile set cât și shopt nu sunt moștenite de subshells.
  • Puteți indica documentația care descrie caracteristicile moștenirii atât a set, cât și a shopt?
  • Ambele set -o și shopt sunt moștenite de sub-cochilii ((...), $(...), componente ale conductei). Dacă sunt moștenite de alte bash invocații depinde dacă SHELLOPTS sau BASHOPTS se află în mediu sau nu.

Răspuns

set provine din bourne shell (sh) și face parte din standardul POSIX, shopt nu este totuși și este specific bourne-again shell (bash) specific:

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 $ 

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *