2015-07-20 1 views
3

Les bash manual page étatspasse GLOBIGNORE à une invocation bash

If the shell is started with the effective user (group) id not equal to 
the real user (group) id, [...] the SHELLOPTS, BASHOPTS, CDPATH, and 
GLOBIGNORE variables if they appear in the environment, are ignored 

Donc, normalement, cela se produit.

> export GLOBIGNORE='*t*' 
> echo * 
afile 
> bash -i 
>> # look, the variable is passed through 
>> $ echo $GLOBIGNORE 
*t* 
>> # but to no effect 
>> $ echo * 
afile anotherfile athirdfile 

Je ne pense pas qu'il serait très logique de faux le vrai nom d'utilisateur pour permettre le passage GLOBIGNORE et un certain nombre d'autres effets secondaires indésirables.

Est-il possibile de faire en sorte que le sous-shell respecte une exportation GLOBIGNORE?

Répondre

0

D'autres hacks shell peuvent venir à la rescousse. Toutes ces solutions nécessitent au moins de modifier l'invocation du shell, mais le démarrage du sous-shell doit être facilement préparé. Comme le démarrage du shell est différent sur les shells interactifs, deux stratégies sont nécessaires.

Interactive

Lors du démarrage d'une session interactive, bash sources normalement le fichier par défaut ~/.bashrc. Il y a un commutateur pour changer où chercher ce fichier. Cela peut être exploité sans perte tant que le script passé là-bas redirige vers l'emplacement d'origine.

> echo 'GLOBIGNORE=*t*' > rc 
> echo 'source ~/.bashrc' >> rc 
> bash --rcfile rc -i 
>> echo * 

non interactif, Modifyable commande Chaîne

As Cyrus already pointed out, on pourrait augmenter simplement la commande de la mission afin qu'il arrive à l'intérieur du sous-shell pour commencer.

> bash -c 'GLOBIGNORE="*t*" ; echo *' 

entièrement automatisé

Si la modification des commandes passées doit être évitée, une autre variable particulière peut être employée. Il est appelé BASH_ENV et indique un script source lors du démarrage d'une session non interactive. Avec cela, une stratégie similaire à --rcfile se pose.

> echo 'GLOBIGNORE=*t*' > rc 
> BASH_ENV=rc bash -c "echo *" 

Ou, pour être encore plus sordide et éviter le fichier temporaire rc, nous pouvons forcer la tuyauterie, ce qui est clairement pas destiné à la valeur - est pas considérée comme l'entrée standard.

> echo 'GLOBIGNORE=*t*' | BASH_ENV=/dev/stdin bash -c "echo *"