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
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 somposix
/physical
/interactive-comments
som inte finns iksh
ochshopt
sådana som finns i andra skal inklusiveksh
för vissa somlogin_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
-
set
är POSIX 7: set – ställa in eller ta bort alternativ och positionsparametrar | pubs.opengroup.org -
shopt
är inte: Skal & Verktyg: Detaljerad Toc | pubs.opengroup.org
Troligen kopplad till historiken som nämns av @Gilles.
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 blevset
svårare att använda eftersom alternativen representeras av koder med en bokstav. Som ett resultat tillhandahåller Bash kommandotshopt
( 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 kommandotshopt
. 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 alternativenset
ochshopt
ärvs inte av subshells. - Kan du peka på dokumentationen som beskriver arvskaraktäristika för både
set
ochshopt
? - Båda
set -o
ochshopt
alternativen ärvs av subshells ((...)
,$(...)
, rörledningskomponenter). Huruvida de ärvs av andrabash
anrop beror på omSHELLOPTS
ellerBASHOPTS
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 $
help set
ochhelp shopt
för att verifiera att även deras författare tycker att de gör samma sak.