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
shopt
laat zien is geërfd? - Nou, er zijn
set -o
opties zoalsposix
/physical
/interactive-comments
die niet inksh
staan, enshopt
die in andere shells inclusiefksh
voor 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
shopt
associëren met $ SH ELL OPT S in plaats van $ BA SHOPT S .
Antwoord
-
set
is POSIX 7: set – opties en positionele parameters in- of uitschakelen | pubs.opengroup.org -
shopt
is 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
-
set
als 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 name
zelf 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/sh
van Solaris 10.
Antwoord
Uit het boek “Linux Shell Scripting with Bash”, p 63:
Historisch gezien werd het
set
commando gebruikt om opties aan en uit te zetten. Naarmate het aantal opties toenam, werdset
moeilijker 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 hetshopt
commando. 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
set
worden niet overgeërfd door subschalen. Zowelset
alsshopt
opties worden niet overgenomen door subschalen. - Kunt u verwijzen naar de documentatie die de overervingskenmerken beschrijft van zowel
set
alsshopt
? - Beide
set -o
enshopt
opties worden overgenomen door subshells ((...)
,$(...)
, pijplijncomponenten). Of ze worden geërfd door anderebash
aanroepen hangt af van het feit ofSHELLOPTS
ofBASHOPTS
in 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 set
enhelp shopt
om te verifiëren dat zelfs hun auteurs denken dat ze hetzelfde doen.