2009-03-20 9 views
2

Quand je lance le script suivant dans Bash 3.2.48:variable n'est pas écho

#!/bin/bash 

export var1='var1' 
echo "UID=$UID" 

if [ x"$UID" != x"0" ] 
then 
    export var2='var2' 
    while ! { sudo -v; }; do { sudo -v; }; done; 
    sudo $0 
    exit 
fi 

echo $var1 
echo $var2 

exit 0 

Ce que je reçois en tant que sortie est:

UID=1000 
UID=0 
var1 

Pourquoi var2 est pas réexporté et répercuté? Je suis à peu près sûr que le même script a fonctionné avec les anciennes versions de Bash.

Répondre

5
  • vous entrez première fois avec UID == 1000, vous entrez la clause si
  • vous sudo pour exécuter le script avec UID == 0; sudo ne conserve pas l'environnement si env_reset est défini dans/etc/sudoers (par défaut dans la plupart des distributions). Vous avez besoin de sudo -E pour préserver env.
  • vous quittez (avant écho)

de la Sudo vous appelez entrer avec env propre.

  • vous entrez avec UID == 0
  • vous ne saisissez pas la clause if, var2 est pas défini
  • vous écho les variables.
1

La réponse est beaucoup plus simple que ce qui est semble: vous jamais l'écho de ces vars (quand pas en tant que root, évidemment), parce que vous quittez déjà :))

Essayez d'éviter/réduire au minimum confusion en ajoutant des instructions de débogage plus appropriées/concises. Par exemple, utiliser un seul écho qui contient tout qui est pertinent à votre problème (c.-à-ID de processus, l'ID utilisateur, var1, var2):

#!/bin/bash 
export var1='var1' 
if [ "$UID" != "0" ] ; then 
    export var2='var2' 
    while ! { sudo -v; }; do { sudo -v; }; done; 
    sudo $0 
    # this is "the key exit" ;-) 
    #exit 
fi 
echo "pid=[$$] uid=[$UID] var1=[$var1] var2=[$var2]" 

Avec la sortie commentée vous obtenez ce que vous attendez (évidemment, dans le processus de « parent », comme « enfant » - celui en cours d'exécution en tant que « root » - atteint jamais cette partie du code qui exporte var2):

pid=[12346] uid=[0] var1=[var1] var2=[] 
pid=[12345] uid=[1] var1=[var1] var2=[var2] 

++ en cours d'exécution parfois des scripts dans mode de débogage (bash -x) aide aussi ;-)

+0

Merci altblue, j'apprécie vraiment votre aide. Mais non, ce n'est pas ce que je veux. Bien que ce ne soit qu'un exemple de code, le vrai script est beaucoup plus long et la partie après la clause if ne devrait être exécutée qu'une seule fois, après avoir rappelé le script avec 'sudo $ 0'. Mais je vois le point avec sudo maintenant, cela fonctionne vraiment avec 'sudo -E $ 0', puisque var2 est alors exporté. La chose étrange est que cela a fonctionné sur mon ancien système sans le commutateur -E ou en modifiant le fichier sudoers. Quoi qu'il en soit, je suis heureux maintenant. Merci les gars. Chris – Chris

Questions connexes