set og shopt er begge shell-indbyggede, der styrer forskellige muligheder. Jeg glemmer ofte, hvilke indstillinger der er angivet med hvilken kommando, og hvilken indstilling der sætter / frasætter (set -o/+o, shopt -s/-u). Hvorfor er der to forskellige kommandoer, der tilsyneladende gør det samme (og har forskellige argumenter for at gøre det)? Er der nogen nem måde / mnemonic at huske, hvilke indstillinger der følger med hvilken kommando?
Kommentarer
Svar
Så vidt jeg ved, er -indstillingerne er dem, der nedarves fra andre skaller i Bourne-stil (for det meste ksh), og indstillingerne shopt er dem, der er specifikke for bash. Der er ingen logik, som jeg kender.
Kommentarer
- Enhver dokumentation, der viser
shopter arvet? - Nå, der er
set -omuligheder somposix/physical/interactive-commentsder ikke er ikshogshoptdem der er i andre skaller inklusivekshfor nogle somlogin_shell/nullglob. Som du siger, der ' er ingen logik. Det var sandsynligvis ideen i starten (at SHELLOPTS ville være standard, og BASHOPTS de bash-specifikke), men det gik tabt undervejs, og nu er det ender bare med at blive irriterende og et UI-design-fiasko.
Svar
Forskellen er i den ændrede miljøvariabel bruges af bash. Indstilling med set -kommandoen resulterer i . Indstilling med shopt -kommandoen resulterer i $BASHOPTS.
Kommentarer
- Ugh! Det er endnu mere forvirrende. Min hjerne ønsker at knytte
shopttil $ SH ELL OPT S i stedet for $ BA SHOPT S .
Svar
-
seter POSIX 7: sæt – indstil eller frakobl indstillinger og positionsparametre | pubs.opengroup.org -
shopter ikke: Shell & Hjælpeprogrammer: Detaljeret Toc | pubs.opengroup.org
Sandsynligvis knyttet til historikken nævnt af @Gilles.
Svar
Let men tabt i historien. Kommandoen set blev oprindeligt brugt til at ændre kommandolinjemiljøet for de originale unix-skaller /bin/sh. Derefter, da forskellige Unix-versioner udviklede sig, og nye shell-smag blev tilføjet, indså folk, at de havde brug for at kunne ændre flere (miljø) ting for at holde shell-scripting kompatibel. På det tidspunkt blev Bash meget populær, og den ekstra sh ell opt ioner var nødvendige og introducerede shopt.
Du kan faktisk se disse compat Ibility-forsøg i kommandoen 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
Men ikke i kommandoen 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
Kommentarer
-
setsom en måde at indstille indstillinger på var ' t i de originale Unix-skaller blev den introduceret af Bourne-skallen i slutningen af 70erne.set -o nameselv blev tilføjet senere af Korn-skallen, angivet men valgfri i POSIX, understøttes stadig ikke af " moderne " versioner af Bourne-skallen som/bin/shaf Solaris 10.
Svar
Fra bogen “Linux Shell Scripting med Bash”, s 63:
Historisk blev kommandoen
setbrugt til at slå indstillinger til og fra. Efterhånden som antallet af muligheder voksede, blevsetsværere at bruge, fordi mulighederne er repræsenteret ved koder med enkelt bogstav. Som et resultat giver Bash kommandoenshopt( shell-indstilling ) til at slå indstillinger til og fra ved navn i stedet for et bogstav. Du kan kun indstille visse indstillinger pr. Brev. Andre er kun tilgængelige under kommandoenshopt. Dette gør at finde og indstille en bestemt mulighed til en forvirrende opgave.
Svar
Det ser ud til, at “set” -muligheder arves af subshells og butikker er ikke.
Kommentarer
- Dejlig fangst. Jeg spekulerer på, om dette er et forsætligt valg eller en bivirkning.
- @ user29778 Mindst under bash 4.1.5 (1) indstillingerne indstillet med
setarves ikke af subshells.Bådesetogshoptindstillinger arves ikke af subshells. - Kan du pege på dokumentationen, der beskriver arveegenskaberne for både
setogshopt? - Begge
set -oogshoptindstillinger arves af subshells ((...),$(...), rørledningskomponenter). Om de arves af andrebashpåkaldelser, afhænger af, omSHELLOPTSellerBASHOPTSer i miljø eller ej.
Svar
set stammer fra bourne shell (sh) og er en del af POSIX-standarden, shopt er dog ikke og er bourne-igen shell (bash) specifik:
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 setoghelp shoptfor at kontrollere, at selv deres forfattere mener, at de gør det samme.