2009-03-20 4 views
2

をエコーされていません。変数は

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

私は出力として得るものです:

UID=1000 
UID=0 
var1 

エクスポートおよびエコーされませんVAR2れるのはなぜ?同じスクリプトが古いBashバージョンで動作することは間違いありません。

答えて

5
  • あなたはUID == 1000年に最初の時間を入力するには、UID == 0でスクリプトを実行するための句
  • もしあなたsudoを入力します。 env_resetが/ etc/sudoers(ほとんどのディストリビューションではデフォルト)に設定されている場合、sudo は環境を保持しません。 envを保存するにはsudo -Eが必要です。
  • あなたのsudoからの出口(をエコー前

は、あなたがきれいなのenvと入力します呼び出します。

  • はあなたが句、VAR2は
  • に設定されていない場合は、変数をエコー入力しないUID == 0
  • を入力してください。
1

答えがあるよりもはるかに簡単であると思われる:(は明らかに、rootとして実行していないとき)あなたはすでに終了しているため、あなた決しては:)、これらのVARSエコー)

は最小限に抑え/回避してくださいより適切な/簡潔なデバッグステートメントを追加することによって混乱を招くことがあります。 、

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

コメントアウト終了して、あなたは(当然期待するものを得る:例えば、あなたの問題(すなわち、プロセスID、ユーザーID、VAR1、VAR2)に関連するのですすべてを含む単一のエコーを使用「親」プロセスでは、「子」1として - 「ルート」として実行されている一つは - VAR2をエクスポートするコードの一部に到達したことはありません):

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

++時々デバッグモードでスクリプトを実行します(bash -x)も役に立ちます;-)

+0

altblueありがとう、本当にありがとうございます。しかし、それは私が望むものではありません。これはサンプルコードだけですが、実際のスクリプトはずっと長く、if節の後の部分は 'sudo $ 0'でスクリプトを再呼び出しした後で一度だけ実行する必要があります。しかし、私は今、sudoとのポイントを見て、実際には 'sudo -E $ 0'で動作します。なぜなら、var2がエクスポートされるからです。奇妙なことは、これが私の古いシステムで-Eスイッチなしで動作すること、またはsudoersファイルを変更することです。とにかく、私は今幸せです。君たちありがとう。 Chris – Chris