set en shopt zijn beide ingebouwde shell-ins die verschillende opties. Ik vergeet vaak welke opties worden ingesteld door welk commando, en welke optie in- / uitschakelt (set -o/+o, shopt -s/-u). Waarom zijn er twee verschillende commandos die schijnbaar hetzelfde doen (en daarvoor verschillende argumenten hebben)? Is er een gemakkelijke manier / geheugensteun om te onthouden welke opties bij welk commando horen?
Opmerkingen
Antwoord
Voor zover ik weet, is het opties zijn degene die zijn geërfd van andere Bourne-achtige shells (meestal ksh), en de shopt opties zijn degene die specifiek zijn voor bash. Er is geen logica die ik ken.
Opmerkingen
- Alle documentatie die
shoptlaat zien is geërfd? - Nou, er zijn
set -oopties zoalsposix/physical/interactive-commentsdie niet inkshstaan, enshoptdie in andere shells inclusiefkshvoor sommigen zoalslogin_shell/nullglob. Zoals je zegt, er zijn ' s geen logica. Het was waarschijnlijk het idee aan het begin (dat SHELLOPTS de standaard zou zijn, en BASHOPTS de bash-specifieke), maar dat ging gaandeweg verloren, en nu eindigt gewoon vervelend en een UI-ontwerpfiasco.
Antwoord
Het verschil zit in de gewijzigde omgevingsvariabele gebruikt door bash. Instellen met de opdracht set resulteert in . Instellen met het shopt commando resulteert in $BASHOPTS.
Reacties
- Ugh! Dat is nog verwarrender. Mijn brein wil
shoptassociëren met $ SH ELL OPT S in plaats van $ BA SHOPT S .
Antwoord
-
setis POSIX 7: set – opties en positionele parameters in- of uitschakelen | pubs.opengroup.org -
shoptis niet: Shell & Hulpprogrammas: gedetailleerde Toc | pubs.opengroup.org
Waarschijnlijk gekoppeld aan de geschiedenis genoemd door @Gilles.
Antwoord
Gemakkelijk maar verloren in de geschiedenis. De opdracht set werd oorspronkelijk gebruikt om de opdrachtregelomgeving van de originele Unix-shells te wijzigen /bin/sh. Toen verschillende Unix-versies evolueerden en nieuwe shell-smaken werden toegevoegd, realiseerden mensen zich dat ze meer (omgevings) dingen moesten kunnen veranderen om shell-scripting compatibel te houden. In die tijd werd Bash erg populair en de aanvullende sh ell opt ionen nodig waren, waardoor shopt werd geïntroduceerd.
Je kunt deze compat ibility pogingen in het shopt commando.
$ 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
Maar niet in het set commando.
$ 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
Reacties
-
setals een manier om opties in te stellen wasn ' t in de originele Unix-shells, het werd eind jaren 70 geïntroduceerd door de Bourne-shell.set -o namezelf is later toegevoegd door de Korn-shell, gespecificeerd maar optioneel in POSIX, nog steeds niet ondersteund door " modern " versies van de Bourne-shell zoals de/bin/shvan Solaris 10.
Antwoord
Uit het boek “Linux Shell Scripting with Bash”, p 63:
Historisch gezien werd het
setcommando gebruikt om opties aan en uit te zetten. Naarmate het aantal opties toenam, werdsetmoeilijker te gebruiken omdat opties worden weergegeven door codes van één letter. Als resultaat biedt Bash hetshopt( shell-optie ) commando om opties aan en uit te zetten op naam in plaats van op een letter. U kunt bepaalde opties alleen per letter instellen. Andere zijn alleen beschikbaar onder hetshoptcommando. Dit maakt het zoeken en instellen van een bepaalde optie een verwarrende taak.
Antwoord
Het lijkt erop dat “set” -opties worden overgenomen door subshells en shopts zijn dat niet.
Reacties
- Leuke vangst. Ik vraag me af of dit een opzettelijke keuze is of een bijwerking.
- @ user29778 Ten minste onder bash 4.1.5 (1) de opties die zijn ingesteld met
setworden niet overgeërfd door subschalen. Zowelsetalsshoptopties worden niet overgenomen door subschalen. - Kunt u verwijzen naar de documentatie die de overervingskenmerken beschrijft van zowel
setalsshopt? - Beide
set -oenshoptopties worden overgenomen door subshells ((...),$(...), pijplijncomponenten). Of ze worden geërfd door anderebashaanroepen hangt af van het feit ofSHELLOPTSofBASHOPTSin de omgeving of niet.
Antwoord
set is afkomstig van de bourne shell (sh) en maakt deel uit van de POSIX-standaard, shopt is echter niet en is bourne-again shell (bash) specifiek:
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 setenhelp shoptom te verifiëren dat zelfs hun auteurs denken dat ze hetzelfde doen.