Set and Shopt – Why Two? (Svenska)

set och shopt är båda skalinbyggda som styr olika alternativ. Jag glömmer ofta vilka alternativ som ställs in av vilket kommando, och vilka alternativ som ställer in / av ({div id = ”605792fbd1″>

, shopt -s/-u). Varför finns det två olika kommandon som till synes gör samma sak (och har olika argument för att göra det)? Finns det något enkelt sätt / mnemonic att komma ihåg vilka alternativ som passar med vilket kommando?

Kommentarer

  • Försök titta på andra raden i help set och help shopt för att verifiera att även deras författare tycker att de gör samma sak.
  • " Ändra värdet på skalattribut " vs " Ändra inställningen för varje skalalternativ ".
  • I Bash 4.1.5 (1) -release står det " Ställ in eller avaktivera värden för skalalternativ och positionsparametrar. " och " Ställ in och avaktivera skalalternativ. ".
  • Skrivning manpages får dig att inse vad du inte vet och får dig att försöka formulera saker på ett sätt som du inte har fel om vad du försöker skriva om.

Svar

Såvitt jag vet är -alternativen är de som ärvs från andra skal i Bourne-stil (mestadels ksh), och shopt -alternativen är de som är specifika för bash. Det finns ingen logik som jag känner till.

Kommentarer

  • Alla dokument som visar shopt är ärvt?
  • Jo, det finns set -o alternativ som posix / physical / interactive-comments som inte finns i ksh och shopt sådana som finns i andra skal inklusive ksh för vissa som login_shell / nullglob. Som du säger, där ' är ingen logik. Det var förmodligen tanken i början (att SHELLOPTS skulle vara de vanliga och BASHOPTS de bash-specifika), men det gick vilse längs vägen, och nu är det slutar bara bli irriterande och ha ett UI-designfiasco.

Svar

Skillnaden ligger i den ändrade miljövariabeln används av bash. Inställning med set -kommandot resulterar i . Inställning med kommandot shopt resulterar i $BASHOPTS.

Kommentarer

  • Ugh! Det är ännu mer förvirrande. Min hjärna vill associera shopt med $ SH ELL OPT S snarare än $ BA SHOPT S .

Svar

Svar

Enkelt men förlorat i historien. Kommandot set användes ursprungligen för att ändra kommandoradsmiljön för de ursprungliga unix-skalen /bin/sh. Sedan olika Unix-versioner utvecklades och nya skalsmaker tillkom, insåg folk att de behövde kunna ändra mer (miljö) saker för att hålla skalskriptkompatibla. Vid den tiden blev Bash väldigt populär och den ytterligare sh ell opt joner behövdes och introducerade shopt.

Du kan faktiskt se dessa compat funktionsförsök i kommandot 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 inte i kommandot 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 ett sätt att ställa in alternativ var ' t i de ursprungliga Unix-skalen, introducerades det av Bourne-skalet i slutet av 70-talet. set -o name själv lades till senare av Korn-skalet, specificerat men valfritt i POSIX, men stöds fortfarande inte av " modern " versioner av Bourne-skalet som /bin/sh i Solaris 10.

Svar

Från boken ”Linux Shell Scripting med Bash”, s 63:

Kommandot set användes historiskt för att aktivera och inaktivera alternativ. När antalet alternativ ökade blev set svårare att använda eftersom alternativen representeras av koder med en bokstav. Som ett resultat tillhandahåller Bash kommandot shopt ( skalalternativ ) för att aktivera och inaktivera alternativ med namn istället för en bokstav. Du kan bara ställa in vissa alternativ per bokstav. Andra är endast tillgängliga under kommandot shopt. Detta gör att hitta och ställa in ett visst alternativ till en förvirrande uppgift.

Svar

Det ser ut som att ”set” -alternativen ärvs av subshells och butiker är inte.

Kommentarer

  • Trevlig fångst. Jag undrar om detta är ett avsiktligt val eller en bieffekt.
  • @ user29778 Åtminstone under bash 4.1.5 (1) alternativen inställda med set ärvs inte av subshells.Båda alternativen set och shopt ärvs inte av subshells.
  • Kan du peka på dokumentationen som beskriver arvskaraktäristika för både set och shopt?
  • Båda set -o och shopt alternativen ärvs av subshells ((...), $(...), rörledningskomponenter). Huruvida de ärvs av andra bash anrop beror på om SHELLOPTS eller BASHOPTS finns i miljö eller inte.

Svar

set härstammar från bourne shell (sh) och är en del av POSIX-standarden, shopt är dock inte och är bourne-again shell (bash) specifikt:

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 $ 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *