Set and Shopt – Waarom twee?

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

  • Kijk eens naar de tweede regel van help set en help shopt om te verifiëren dat zelfs hun auteurs denken dat ze hetzelfde doen.
  • " Wijzig de waarde van shell-attributen " vs " Wijzig de instelling van elke shell-optie ".
  • In Bash 4.1.5 (1) -release staat " Stel waarden van shell-opties en positionele parameters in of uit. " en " Stel shell-opties in en uit. ", respectievelijk.
  • Schrijven manpages laat je beseffen wat je niet weet en laat je proberen dingen te formuleren op een manier die je niet verkeerd hebt over waar je over probeert te schrijven.

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 zoals posix / physical / interactive-comments die niet in ksh staan, en shopt die in andere shells inclusief ksh voor sommigen zoals login_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

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, werd set moeilijker te gebruiken omdat opties worden weergegeven door codes van één letter. Als resultaat biedt Bash het shopt ( 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 het shopt 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. Zowel set als shopt opties worden niet overgenomen door subschalen.
  • Kunt u verwijzen naar de documentatie die de overervingskenmerken beschrijft van zowel set als shopt?
  • Beide set -o en shopt opties worden overgenomen door subshells ((...), $(...), pijplijncomponenten). Of ze worden geërfd door andere bash aanroepen hangt af van het feit of SHELLOPTS of BASHOPTS 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 $ 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *