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
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
-
set
este POSIX 7: set – setează sau anulează opțiuni și parametri de poziție | pubs.opengroup.org -
shopt
nu este: Shell & Utilități: Toc detaliat | pubs.opengroup.org
Probabil legată de istoria menționată de @Gilles.
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ă comandashopt
( 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 comandashopt
. 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țiunileset
cât șishopt
nu sunt moștenite de subshells. - Puteți indica documentația care descrie caracteristicile moștenirii atât a
set
, cât și ashopt
? - Ambele
set -o
șishopt
sunt moștenite de sub-cochilii ((...)
,$(...)
, componente ale conductei). Dacă sunt moștenite de altebash
invocații depinde dacăSHELLOPTS
sauBASHOPTS
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 $
help set
șihelp shopt
pentru a verifica dacă chiar și autorii lor cred că fac același lucru.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
shopt
este moștenit?set -o
opțiuni precumposix
/physical
/interactive-comments
care nu se află înksh
șishopt
care se află în alte cochilii, inclusivksh
pentru unii calogin_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.