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
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 comeposix
/physical
/interactive-comments
che non si trovano inksh
eshopt
in altri shell tra cuiksh
per alcuni comelogin_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
-
set
è POSIX 7: set – imposta o deseleziona opzioni e parametri posizionali | pubs.opengroup.org -
shopt
non è: Utilità & della shell: dettaglio Toc | pubs.opengroup.org
Probabilmente collegato alla storia citata da @Gilles.
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 stessaset -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 comandoshopt
( 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 comandoshopt
. 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 opzioniset
eshopt
non vengono ereditate dalle subshell. - Puoi indicare la documentazione che descrive le caratteristiche di ereditarietà di
set
eshopt
? - Entrambi
set -o
eshopt
vengono ereditate dalle subshell ((...)
,$(...)
, componenti della pipeline). Il fatto che vengano ereditati da altribash
richiami dipende dal fatto cheSHELLOPTS
oBASHOPTS
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 $
help set
ehelp shopt
per verificare che anche i loro autori pensano di fare la stessa cosa.