Set and Shopt – Why Two?

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

  • Prøv at se på anden linje i help set og help shopt for at kontrollere, at selv deres forfattere mener, at de gør det samme.
  • " Skift værdien af shellattributter " vs " Skift indstillingen for hver shell-indstilling ".
  • I Bash 4.1.5 (1) -release står der " Indstil eller frakobl værdier for shell-indstillinger og positionsparametre. " og " Indstil og frakobl shell-indstillinger. Henholdsvis ".
  • Skrivning manpages får dig til at indse, hvad du ikke ved, og får dig til at prøve at formulere tingene på en måde, som du ikke tager forkert med, hvad du prøver at skrive om.

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 som posix / physical / interactive-comments der ikke er i ksh og shopt dem der er i andre skaller inklusive ksh for nogle som login_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

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, blev set sværere at bruge, fordi mulighederne er repræsenteret ved koder med enkelt bogstav. Som et resultat giver Bash kommandoen shopt ( 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 kommandoen shopt. 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åde set og shopt indstillinger arves ikke af subshells.
  • Kan du pege på dokumentationen, der beskriver arveegenskaberne for både set og shopt?
  • Begge set -o og shopt indstillinger arves af subshells ((...), $(...), rørledningskomponenter). Om de arves af andre bash påkaldelser, afhænger af, om SHELLOPTS eller BASHOPTS 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 $ 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *