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
shopt
er arvet? - Nå, der er
set -o
muligheder somposix
/physical
/interactive-comments
der ikke er iksh
ogshopt
dem der er i andre skaller inklusiveksh
for 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
shopt
til $ SH ELL OPT S i stedet for $ BA SHOPT S .
Svar
-
set
er POSIX 7: sæt – indstil eller frakobl indstillinger og positionsparametre | pubs.opengroup.org -
shopt
er 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
-
set
som 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 name
selv blev tilføjet senere af Korn-skallen, angivet men valgfri i POSIX, understøttes stadig ikke af " moderne " versioner af Bourne-skallen som/bin/sh
af Solaris 10.
Svar
Fra bogen “Linux Shell Scripting med Bash”, s 63:
Historisk blev kommandoen
set
brugt til at slå indstillinger til og fra. Efterhånden som antallet af muligheder voksede, blevset
svæ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
set
arves ikke af subshells.Bådeset
ogshopt
indstillinger arves ikke af subshells. - Kan du pege på dokumentationen, der beskriver arveegenskaberne for både
set
ogshopt
? - Begge
set -o
ogshopt
indstillinger arves af subshells ((...)
,$(...)
, rørledningskomponenter). Om de arves af andrebash
påkaldelser, afhænger af, omSHELLOPTS
ellerBASHOPTS
er 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 set
oghelp shopt
for at kontrollere, at selv deres forfattere mener, at de gør det samme.