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
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
commeposix
/physical
/interactive-comments
qui ne sont pas dansksh
, etshopt
ceux qui sont dans dautres shells incluantksh
pour certains commelogin_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
-
set
est POSIX 7: set – définir ou annuler les options et les paramètres de position | pubs.opengroup.org -
shopt
nest pas: Shell & Utilitaires: table des matières détaillée | pubs.opengroup.org
Probablement lié à lhistorique mentionné par @Gilles.
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 commandeshopt
( 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 commandeshopt
. 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 optionsset
etshopt
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
etshopt
? - Les deux
set -o
etshopt
sont héritées par les sous-shell ((...)
,$(...)
, composants de pipeline). La question de savoir si elles sont héritées par dautresbash
invocations dépend du fait queSHELLOPTS
ouBASHOPTS
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 $
help set
ethelp shopt
pour vérifier que même leurs auteurs pensent faire la même chose.