2009-03-20 7 views
2

Echo wird, wenn ich das folgende Skript in Bash 3.2.48 laufen:Variable ist nicht

#!/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 

Was ich als Ausgabe zu erhalten ist:

UID=1000 
UID=0 
var1 

Warum ist var2 nicht exportiert und Echo? Ich bin mir ziemlich sicher, dass das gleiche Skript mit älteren Bash-Versionen funktioniert hat.

Antwort

5
  • Sie zum ersten Mal mit UID == 1000 eingeben, geben Sie die if-Klausel
  • Sie sudo das Skript mit UID == 0 auszuführen; sudo bewahrt nicht die Umgebung wenn env_reset in/etc/sudoers gesetzt ist (Standard in den meisten Distributionen). Sie benötigen sudo -E, um env zu konservieren.
  • Sie verlassen (vor Echo)

vom sudo rufen Sie mit sauberen env eingeben.

  • Sie eingeben, mit UID == 0
  • Sie die nicht eingeben, wenn Klausel, var2 nicht gesetzt
  • Sie die Variablen Echo.
1

Die Antwort ist viel einfacher, als es scheint: Sie nie diese Vars Echo (wenn nicht als root läuft, natürlich), weil Sie bereits verlassen :))

Versuchen Vermeidung/Minimierung Verwirrung durch Hinzufügen geeigneter/prägnanter Debug-Anweisungen. Zum Beispiel verwendet ein einziges Echo, das alles enthält, die für Ihr Problem relevant ist (dh Prozess-ID, User-ID, 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]" 

Mit dem Ausgang auf Kommentar Sie bekommen, was Sie erwarten, (natürlich, in dem „Eltern“ Prozess, der als „Kind“ ein - läuft die man als „root“ - nie erreicht, dass ein Teil des Codes, var2) exportiert:

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

++ manchmal Ausführen von Skripten in Debug-Modus (bash -x) hilft auch ;-)

+0

Danke altblue, ich schätze deine Hilfe sehr. Aber nein, das will ich nicht. Natürlich ist dies nur ein Beispielcode, das echte Skript ist viel länger und der Teil nach der if-Klausel sollte nur einmal ausgeführt werden, nachdem das Skript mit 'sudo $ 0' erneut aufgerufen wurde. Aber ich sehe den Punkt mit sudo jetzt, es funktioniert wirklich mit 'sudo -E $ 0', da var2 dann exportiert wird. Das Seltsame ist, dass dies auf meinem alten System ohne den -E-Schalter funktionierte oder die sudoers-Datei modifiziert hat. Jedenfalls bin ich jetzt glücklich. Danke Jungs. Chris – Chris

Verwandte Themen