2017-04-20 7 views
1

$猫test.pyPythonとBashコマンドラインのenv varsは別々に扱われましたか?

#!/usr/bin/env python 
# coding=utf-8 
import os 
print (os.environ.get('test')) 

$テスト= 4のpython test.py

4 

$テスト= 4; python test.py

None 

シェルに私のpythonと異なる持っている間:

$テスト= 4;エコー$テスト

4 

しかし:

$テスト= 2
$テスト= 4のエコー$テスト

2 

は、だから私は、Pythonやbashは状況に対処する方法については混乱しています。誰か説明できますか?

答えて

2

$ export test=4 

その後、あなたのPythonスクリプトを実行します。ここで

スクリプト内の変数testを取得しますので、

test=4 python test.py 

は、pythonの環境にtest=4を渡します。

test=4; python test.py 

のに対し、すなわち環境に伝播されることはありませんだけで、現在のシェルセッションで使用可能なシェル変数を(あなただけの罰金シェルから値を取得している理由です)を作成します。

export test=4; python test.py 

:プロセスの環境変数を利用できるように、すべてのサブプロセス、すなわち変数を継承するように

が変数環境変数を作成するには、任意のPOSIXシェルの通常の方法は exportに変数でありますあなたの最後の場合:

$ test=2 
$ test=4 echo $test 
2 

echo BUI前に起こっ変数testの展開lt-inが実行されます。

あなたが後で拡張を維持するために、いくつかの方法を使用する必要があります。

$ test=2 
$ test=4 sh -c 'echo $test' 
4 
+0

いかがですか? – jiamo

+0

@jiamo編集内容を確認してください... – heemayl

+0

「エコービルトインを実行する前に起こっていること」を理解できます。 。なぜpythonがコマンドのenvにvarを渡すのが好きではないのですか? 'sh -c'はpythonのような新しいシェルを開いているようです。したがって、解析ステップ。見ているenvそれareadyだった。 – jiamo

1

Pythonの変数をエクスポートする必要があります。シェルと環境変数の違い厥

$ ./test.py 
+0

'export test = 4; python test.py' works – jiamo

+0

'test = 2;で' 2'を得る理由がわかりません。テスト= 4; echo $ test'、それは間違いなく '4'でなければなりません。 –

+0

私は質問を変えます。ミスライト。 – jiamo

1

この...

test=4 python test.py 

が...これに対し、...

test=4; python test.py 

... 2つの別々のコマンドで、明示的にその環境に設定された変数testで、単一pythonコマンドです。最初の変数は、現在のシェルで変数test(エクスポートのマークなし)を設定するようにbashに指示し、もう1つはpythonコマンドです。自然に、Pythonは環境変数を見ません。あなたはその後

echo $test 

をすれば、それは、コマンドラインを処理としてしかし、その後シェル(ないecho command)は、その値を変数参照を展開します。結果として展開されるコマンドは、

echo 4 

です。これは期待どおりです。

関連する問題