Dangers de shopt

Dans une autre question, il était suggéré que j'utilise

shopt -s extglob 

Pour résoudre un problème. J'ai l'printing que ces commands de type doivent être utilisées avec parcimonie, peut-être parce qu'elles peuvent avoir des effets néfastes avec d'autres scripts. Quelqu'un peut-il parler à cela?

shopt n'affecte que le comportement du shell dans lequel cette command est exécutée. Si vous le placez dans ~/.bashrc , cela affectera les shells interactifs non-connectés et les commands exécutées sur rsh / ssh (les shells de connection peuvent également être affectés si ~/.bashrc provient de ~/.profile ou ~/.bash_profile ).

Le paramétrage de la variable d'environnement BASHOPTS sur extglob affecte tous les shells bash interactifs ou non interactifs démarrés lorsque cette variable d'environnement est définie (sauf s'ils sont appelés sh ).

Les shells interactifs sont là où vous voulez avoir le extglob parameters, parce que c'est là que vous voulez l'utiliser, donc ~/.bashrc est un bon endroit pour le mettre à profit dans chaque shell interactif. Si vous voulez l'utiliser dans un script, ajoutez-le au début du script.

Le seul endroit où cela pourrait poser problème est quand il est défini alors que du code que vous n'avez pas écrit ne s'attend pas à ce qu'il soit défini. Cela peut être, par exemple, des scripts que vous générez à l'invite ou dans ~/.bashrc après avoir défini l'option.

Bien que cela soit vrai pour certaines options, ce n'est pas pour extglob car il a été conçu avec soin (par David Korn comme venant de ksh) afin de ne pas briser la compatibilité avec le shell Bourne (et explique pourquoi la syntaxe est si maladroite).

En gros, tout élément utilisant des globs étendus serait une erreur de syntaxe dans le shell Bourne ou dans la syntaxe du shell POSIX. Si un script Bourne ou POSIX avait echo @(a) , il serait cassé (à cause de la parenthèse non-citée). Cela n'aurait pas d'importance si tout d'un coup il commençait à sortir "a" au lieu d'un message d'erreur.

Pourquoi bash ne l'active pas par défaut n'est pas clair pour moi, étant donné que bash n'a pas d'autre syntaxe de rlocation étendue glob propre comme zsh le fait.

EDIT . Bien que David Korn ait essayé de ne pas casser la compatibilité Bourne / POSIX, il semble que bash n'était pas si prudent et est probablement pourquoi il n'est pas activé par défaut comme dans ksh.

Dans ksh (et zsh dans l'émulation ksh), les opérateurs de globulation étendus sont désactivés lors de l'exécution de globulation lors de la substitution d'un paramètre ou d'une command:

 $ touch a $ a='@(a)' ksh93 -c 'echo $a' @(a) 

Alors qu'en bash, ce n'est pas le cas:

 $ a='@(a)' BASHOPTS=extglob bash -c 'echo $a' a