set
et shopt
sont tous deux intégrés au shell qui contrôlent diverses options. J'oublie souvent quelles options sont définies par quelle commande et quelles options sont définies / non définies ( set -o/+o
, shopt -s/-u
). Pourquoi deux commandes différentes font-elles apparemment la même chose (et ont des arguments différents pour le faire)? Existe-t-il un moyen simple / mnémonique de se rappeler quelles options vont avec quelle commande?
72
help set
ethelp shopt
vérifiez que même leurs auteurs pensent qu'ils font la même chose.Réponses:
Autant que je sache, les
set -o
options sont celles héritées d'autres shells de type Bourne (principalement ksh), et lesshopt
options sont celles spécifiques à bash. Il n'y a pas de logique à ma connaissance.la source
shopt
est héritée?set -o
options telles queposix
/physical
/interactive-comments
qui ne figurent pas dansksh
, etshopt
celles qui se trouvent dans d’autres shell, y comprisksh
pour certains commelogin_shell
/nullglob
. Comme tu le dis, il n'y a pas de logique. C'était probablement l'idée de départ (que SHELLOPTS soient les standards, et BASHOPTS les spécifiques), mais cela s'est perdu en cours de route, et cela finit par être ennuyeux et un fiasco de conception d'interface utilisateur.La différence réside dans la variable d'environnement modifiée utilisée par bash. Définir avec la
set
commande résulte en$SHELLOPTS
. Définir avec lashopt
commande résulte en$BASHOPTS
.la source
shopt
avec $ SH ELL OPT S plutôt que $ BA SHOPT S.set
is POSIX 7: set - définit ou non les options et les paramètres de position | pubs.opengroup.orgshopt
n'est pas: Shell & Utilities: Toc détaillé | pubs.opengroup.orgProbablement lié à l'histoire mentionnée par @Gilles.
la source
Facile mais perdu dans l'histoire. La
set
commande a été utilisée à l'origine pour modifier l'environnement de ligne de commande des shells Unix d'origine/bin/sh
. Puis, à mesure que différentes versions d'Unix ont évolué et que de nouvelles versions de shell ont été ajoutées, les utilisateurs ont compris qu'ils devaient pouvoir changer davantage de choses (d'environnement) afin de conserver la compatibilité des scripts de shell. A cette époque Bash est devenu très populaire et les autres sh ELL opt ions était nécessaire, l' introductionshopt
.Vous pouvez voir ces compat tentatives de de la bilité
shopt
commande.Mais pas dans la
set
commande.la source
set
comme moyen de définir les options ne figurait pas dans les shells Unix d’origine, 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, mais pas encore pris en charge par les versions "modernes" du shell Bourne comme celui/bin/sh
de Solaris 10.Extrait du livre "Linux Shell Scripting with Bash", p 63:
la source
Il semble que les options "set" soient héritées par les sous-shell et que les options ne le soient pas.
la source
set
ne sont pas héritées par les sousset
- shell . Lesshopt
options et les options ne sont pas héritées par les sous-shell.set
etshopt
?set -o
etshopt
sont héritées par les sous-shell ((...)
,$(...)
composants de pipeline). Qu'elles soient héritées par d'autresbash
invocationsSHELLOPTS
ou non, ellesBASHOPTS
dépendent de l'environnement.set
provient de la bourne shell (sh) et fait partie du standard POSIX,shopt
mais n'est pas et est spécifique à la bourne-again shell (bash):la source