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 -oopzioni comeposix/physical/interactive-commentsche non si trovano inksheshoptin altri shell tra cuikshper 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
shopta $ SH ELL OPT S anziché a $ BA SHOPT S .
Risposta
-
setè POSIX 7: set – imposta o deseleziona opzioni e parametri posizionali | pubs.opengroup.org -
shoptnon è: 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
-
setcome 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/shdi Solaris 10.
Risposta
Dal libro “Linux Shell Scripting with Bash”, p 63:
Storicamente, il comando
setveniva 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
setnon vengono ereditate dalle subshell. Entrambe le opzioniseteshoptnon vengono ereditate dalle subshell. - Puoi indicare la documentazione che descrive le caratteristiche di ereditarietà di
seteshopt? - Entrambi
set -oeshoptvengono ereditate dalle subshell ((...),$(...), componenti della pipeline). Il fatto che vengano ereditati da altribashrichiami dipende dal fatto cheSHELLOPTSoBASHOPTSsiano 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 setehelp shoptper verificare che anche i loro autori pensano di fare la stessa cosa.