Set and Shopt – Pourquoi deux?

set et shopt sont tous deux des composants internes du shell qui contrôlent divers options. Joublie souvent quelles options sont définies par quelle commande, et quelle option définit / désactive (set -o/+o, shopt -s/-u). Pourquoi y a-t-il deux commandes différentes qui semblent faire la même chose (et ont des arguments différents pour le faire)? Existe-t-il un moyen / mnémonique simple de se souvenir des options associées à quelle commande?

Commentaires

  • Essayez de regarder la deuxième ligne de help set et help shopt pour vérifier que même leurs auteurs pensent faire la même chose.
  •  » Modifier la valeur des attributs du shell  » vs  » Modifier le paramètre de chaque option du shell « .
  • Dans Bash 4.1.5 (1) -release, il est indiqué  » Définir ou annuler les valeurs des options du shell et des paramètres de position.  » et  » Définir et désactiver les options du shell. « , respectivement.
  • Écriture manpages vous fait réaliser ce que vous ne savez pas et vous fait essayer de formuler les choses dune manière que vous ne vous trompez pas sur ce que vous essayez décrire.

Réponse

Pour autant que je sache, le sont celles qui sont héritées dautres shells de style Bourne (principalement ksh), et les options shopt sont celles qui sont spécifiques à bash. Il ny a aucune logique à ma connaissance.

Commentaires

  • Toute documentation qui montre shopt est hérité?
  • Eh bien, il existe des options set -o comme posix / physical / interactive-comments qui ne sont pas dans ksh, et shopt ceux qui sont dans dautres shells incluant ksh pour certains comme login_shell / nullglob. Comme vous le dites, il y a ‘ nest pas logique. Cétait probablement lidée au départ (que SHELLOPTS serait les standards, et BASHOPTS les spécifiques à bash), mais cela sest perdu en cours de route, et maintenant cest finit juste par être ennuyeux et un fiasco de conception dinterface utilisateur.

Réponse

La différence réside dans la variable denvironnement modifiée utilisé par bash. La configuration avec la commande set donne . La définition avec la commande shopt entraîne $BASHOPTS.

Commentaires

  • Ugh! Cest encore plus déroutant. Mon cerveau veut associer shopt à $ SH ELL OPT S plutôt quà $ BA SHOPT S .

Réponse

Réponse

Facile mais perdu dans lhistoire. La commande set était à lorigine utilisée pour modifier lenvironnement de ligne de commande des shells Unix dorigine /bin/sh. Ensuite, au fur et à mesure que diverses versions dUnix évoluaient et que de nouvelles saveurs de shell étaient ajoutées, les gens se rendirent compte quils devaient être en mesure de changer davantage de choses (denvironnement) afin de maintenir la compatibilité des scripts shell. À cette époque, Bash est devenu très populaire et les sh ell opt ions était nécessaire, introduisant shopt.

Vous pouvez réellement voir ces compat tentatives de compatibilité dans la commande 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 

Mais pas dans la commande 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 

Commentaires

  • set comme moyen de définir les options nétait ‘ t dans les shells Unix dorigine, il a été introduit par le shell Bourne à la fin des années 70. set -o name lui-même a été ajouté plus tard par le shell Korn, spécifié mais facultatif dans POSIX, toujours pas pris en charge par  » modern  » versions du shell Bourne comme le /bin/sh de Solaris 10.

Réponse

Extrait du livre « Linux Shell Scripting with Bash », p 63:

Historiquement, la commande set était utilisée pour activer et désactiver les options. À mesure que le nombre doptions augmentait, set est devenu plus difficile à utiliser car les options sont représentées par des codes à une seule lettre. En conséquence, Bash fournit la commande shopt ( option shell ) pour activer et désactiver les options par nom au lieu dune lettre. Vous ne pouvez définir certaines options que par lettre. Dautres ne sont disponibles que sous la commande shopt. Cela rend la recherche et la définition dune option particulière une tâche déroutante.

Réponse

Il semble que les options « set » soient héritées par des sous-shell et les shopts ne le sont pas.

Commentaires

  • Belle prise. Je me demande sil sagit dun choix intentionnel ou dun effet secondaire.
  • @ user29778 Au moins sous bash 4.1.5 (1) les options définies avec set ne sont pas héritées par les sous-shells.Les options set et shopt ne sont pas héritées par les sous-shell.
  • Pouvez-vous nous référer à la documentation qui décrit les caractéristiques dhéritage des deux set et shopt?
  • Les deux set -o et shopt sont héritées par les sous-shell ((...), $(...), composants de pipeline). La question de savoir si elles sont héritées par dautres bash invocations dépend du fait que SHELLOPTS ou BASHOPTS se trouve dans le environnement ou pas.

La réponse

set provient du bourne shell (sh) et fait partie du standard POSIX, shopt nest cependant pas et est spécifique au bourne-again shell (bash):

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 $ 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *