Set and Shopt – Why Two? (Norsk)

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

  • Prøv å se på den andre linjen i help set og help shopt for å bekrefte at selv forfatterne deres tror de gjør det samme.
  • " Endre verdien på skallattributter " vs " Endre innstillingen for hvert skallalternativ ".
  • I Bash 4.1.5 (1) -release står det " Angi eller deaktiver verdier for skallalternativer og posisjonsparametere. " og " Angi og deaktiver skallalternativer. Henholdsvis ".
  • Skriving manpages får deg til å forstå hva du ikke vet, og får deg til å prøve å formulere ting på en måte som du ikke er galt om hva du prøver å skrive om.

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 som posix / physical / interactive-comments som ikke er i ksh, og shopt de som er i andre skjell inkludert ksh for noen som login_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

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, ble set vanskeligere å bruke fordi alternativene er representert med koder for en bokstav. Som et resultat gir Bash kommandoen shopt ( 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 under shopt -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åde set og shopt alternativene arves ikke av subshells.
  • Kan du peke på dokumentasjonen som beskriver arveegenskapene til både set og shopt?
  • Begge set -o og shopt alternativene arves av subshells ((...), $(...), rørledningskomponenter). Om de arves av andre bash påkallinger, avhenger av om SHELLOPTS eller BASHOPTS 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 $ 

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *