set
og shopt
er begge skallinnbygginger som styrer forskjellige alternativer. Jeg glemmer ofte hvilke alternativer som er angitt av hvilken kommando, og hvilket alternativ som setter / frasetter (set -o/+o
, shopt -s/-u
). Hvorfor er det to forskjellige kommandoer som tilsynelatende gjør det samme (og har forskjellige argumenter for å gjøre det)? Er det noen enkel måte å huske hvilke alternativer som følger med hvilken kommando?
Kommentarer
Svar
Så vidt jeg vet, er -alternativene er de som arves fra andre skjell i Bourne-stil (for det meste ksh), og shopt
-alternativene er de som er spesifikke for bash. Det er ingen logikk som jeg vet om.
Kommentarer
- Enhver dokumentasjon som viser
shopt
er arvet? - Vel, det er
set -o
alternativer somposix
/physical
/interactive-comments
som ikke er iksh
, ogshopt
de som er i andre skjell inkludertksh
for noen somlogin_shell
/nullglob
. Som du sier, der ' er ingen logikk. Det var sannsynligvis ideen i starten (at SHELLOPTS ville være de vanlige, og BASHOPTS de bash-spesifikke), men det gikk seg vill underveis, og nå er det ender bare med å bli irriterende og et UI-design-fiasko.
Svar
Forskjellen er i den endrede miljøvariabelen brukt av bash. Innstilling med set
-kommandoen resulterer i . Innstilling med shopt
-kommandoen resulterer i $BASHOPTS
.
Kommentarer
- Ugh! Det er enda mer forvirrende. Hjernen min vil knytte
shopt
til $ SH ELL OPT S i stedet for $ BA SHOPT S .
Svar
-
set
er POSIX 7: sett – angi eller deaktivere alternativer og posisjonsparametere | pubs.opengroup.org -
shopt
er ikke: Skal & Verktøy: Detaljert Toc | pubs.opengroup.org
Sannsynligvis knyttet til historikken nevnt av @Gilles.
Svar
Enkelt, men tapt i historien. Kommandoen set
ble opprinnelig brukt til å endre kommandolinjemiljøet til de originale unix-skjellene /bin/sh
. Da forskjellige Unix-versjoner utviklet seg, og nye skallsmaker ble lagt til, skjønte folk at de trengte å kunne endre flere (miljø) ting for å holde skallskripting kompatibel. På den tiden ble Bash veldig populær, og den ekstra sh ell opt ioner var nødvendig, og introduserte shopt
.
Du kan faktisk se disse compat mobilitetsforsøk 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 set
-kommandoen.
$ 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åte å angi alternativer på var ikke ' t i de originale Unix-skjellene, ble den introdusert av Bourne-skallet på slutten av 70-tallet.set -o name
selv ble lagt til senere av Korn-skallet, spesifisert men valgfritt i POSIX, fremdeles ikke støttet av " moderne " versjoner av Bourne-skallet som/bin/sh
av Solaris 10.
Svar
Fra boken «Linux Shell Scripting with Bash», s 63:
Historisk ble kommandoen
set
brukt til å slå alternativene på og av. Etter hvert som antall alternativer økte, bleset
vanskeligere å bruke fordi alternativene er representert med koder for en bokstav. Som et resultat gir Bash kommandoenshopt
( skallalternativ ) for å slå alternativene på og av ved navn i stedet for en bokstav. Du kan bare angi visse alternativer per bokstav. Andre er bare tilgjengelige undershopt
-kommandoen. Dette gjør å finne og sette et bestemt alternativ til en forvirrende oppgave.
Svar
Det ser ut til at «set» -alternativene er arvet av subshells og butikkene er ikke.
Kommentarer
- Fin fangst. Jeg lurer på om dette er et forsettlig valg eller en bivirkning.
- @ user29778 I det minste under bash 4.1.5 (1) alternativene satt med
set
arves ikke av subshells.Bådeset
ogshopt
alternativene arves ikke av subshells. - Kan du peke på dokumentasjonen som beskriver arveegenskapene til både
set
ogshopt
? - Begge
set -o
ogshopt
alternativene arves av subshells ((...)
,$(...)
, rørledningskomponenter). Om de arves av andrebash
påkallinger, avhenger av omSHELLOPTS
ellerBASHOPTS
er i miljø eller ikke.
Svar
set
stammer fra bourne shell (sh) og er en del av POSIX-standarden, shopt
er imidlertid ikke og er bourne-again shell (bash) spesifikk:
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 å bekrefte at selv forfatterne deres tror de gjør det samme.