Set and Shopt – Perché due?

set e shopt sono entrambi incorporati della shell che controllano vari opzioni. Spesso dimentico quali opzioni sono impostate da quale comando e quale opzione imposta / disattiva (set -o/+o, shopt -s/-u). Perché ci sono due comandi diversi che apparentemente fanno la stessa cosa (e hanno argomenti diversi per farlo)? Esiste un modo semplice / mnemonico per ricordare quali opzioni vanno con quale comando?

Commenti

  • Prova a guardare la seconda riga di help set e help shopt per verificare che anche i loro autori pensano di fare la stessa cosa.
  • " Modifica il valore degli attributi della shell " vs " Modifica limpostazione di ciascuna opzione della shell ".
  • In Bash 4.1.5 (1) -release viene visualizzato " Imposta o annulla i valori delle opzioni della shell e dei parametri posizionali. " e " Imposta e annulla le opzioni della shell. ", rispettivamente.
  • Scrittura manpage ti fa realizzare ciò che non sai e ti fa provare a formulare cose in un modo in cui non hai sbagliato a scrivere.

Risposta

Per quanto ne so, il sono quelle ereditate da altre shell in stile Bourne (principalmente ksh), e le opzioni shopt sono quelle specifiche di bash. Non esiste alcuna logica che io sappia.

Commenti

  • Qualsiasi documentazione che mostri shopt è ereditato?
  • Bene, ci sono set -o opzioni come posix / physical / interactive-comments che non si trovano in ksh e shopt in altri shell tra cui ksh per alcuni come login_shell / nullglob. Come dici tu, ci ' non è logica. Probabilmente era lidea allinizio (che SHELLOPTS sarebbero stati quelli standard e BASHOPTS quelli specifici di bash), ma si è persa lungo la strada, e ora finisce per essere fastidioso e un fiasco nella progettazione dellinterfaccia utente.

Risposta

La differenza è nella variabile di ambiente modificata utilizzato da bash. Limpostazione con il comando set produce . Limpostazione con il comando shopt produce $BASHOPTS.

Commenti

  • Uffa! Questo è ancora più confuso. Il mio cervello desidera associare shopt a $ SH ELL OPT S anziché a $ BA SHOPT S .

Risposta

Risposta

Facile ma perso nella storia. Il comando set è stato originariamente utilizzato per modificare lambiente della riga di comando delle shell unix originali /bin/sh. Poi, con levolversi di varie versioni di Unix e laggiunta di nuove versioni di shell, le persone si sono rese conto che avevano bisogno di essere in grado di cambiare più cose (dellambiente) per mantenere compatibile lo script di shell. A quel tempo Bash divenne molto popolare e lulteriore sh ell opt ioni, introducendo shopt.

Puoi effettivamente vedere questi compat ibility nel comando 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 

Ma non nel comando 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 

Commenti

  • set come metodo per impostare le opzioni non era ' t nelle shell Unix originali, è stato introdotto dalla shell Bourne alla fine degli anni 70. La stessa set -o name è stata aggiunta successivamente dalla shell Korn, specificata ma facoltativa in POSIX, ancora non supportata dal " moderno " versioni della Bourne shell come /bin/sh di Solaris 10.

Risposta

Dal libro “Linux Shell Scripting with Bash”, p 63:

Storicamente, il comando set veniva utilizzato per attivare e disattivare le opzioni. Man mano che il numero di opzioni cresceva, set è diventato più difficile da utilizzare perché le opzioni sono rappresentate da codici a una sola lettera. Di conseguenza, Bash fornisce il comando shopt ( opzione della shell ) per attivare e disattivare le opzioni per nome invece che per lettera. È possibile impostare alcune opzioni solo per lettera. Altri sono disponibili solo con il comando shopt. Ciò rende la ricerca e limpostazione di una particolare opzione unattività confusa.

Risposta

Sembra che le opzioni “set” siano ereditate da subshell e i negozi non lo sono.

Commenti

  • Bella presa. Mi chiedo se questa sia una scelta intenzionale o un effetto collaterale.
  • @ user29778 Almeno in bash 4.1.5 (1) le opzioni impostate con set non vengono ereditate dalle subshell. Entrambe le opzioni set e shopt non vengono ereditate dalle subshell.
  • Puoi indicare la documentazione che descrive le caratteristiche di ereditarietà di set e shopt?
  • Entrambi set -o e shopt vengono ereditate dalle subshell ((...), $(...), componenti della pipeline). Il fatto che vengano ereditati da altri bash richiami dipende dal fatto che SHELLOPTS o BASHOPTS siano nel ambiente o meno.

Risposta

set ha origine dal bourne shell (sh) e fa parte dello standard POSIX, shopt non lo è ed è specifico della shell 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 $ 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *