問題
pythonで os.environ[] で環境変数を受け取るコードを作った。
import os print(os.environ['FOO']) print(os.environ['BAR'])
↑のコードを実行するコードの実行方法をREADMEに以下のように書いた。
# 以下のexportを実行してから、pythonコードを実行してください export FOO=aaa \ # comment... BAR=bbb
↑のexportを実行後、pythonコードを動かしてみたらエラーとなった。
python3 env.py
aaa
Traceback (most recent call last):
File "/tmp/env.py", line 4, in <module>
print(os.environ['BAR'])
~~~~~~~~~~^^^^^^^
File "<frozen os>", line 685, in __getitem__
KeyError: 'BAR'
「何か間違えた?」と思いながら echo(1) を実行するが FOO BAR 共に問題なく宣言できているように見え混乱した。
echo $FOO $BAR aaa bbb
原因
export文の中にコメントを入れたのがよくなかった。
以下を実行するとコメント文を入れた箇所で処理が分断され、 export $FOO=aaa と $BAR=bbb という2つのコマンドが別個に実行される。
export FOO=aaa \ # comment... BAR=bbb
その結果、 FOO は環境変数、 BAR はシェル変数として宣言される。
echo(1) は環境変数とシェル変数両方を参照するのでこのような場合の切り分けには向かない。
従って、変わりに export -p を使うべき。
$ export -p | grep FOO export FOO=aaa $ export -p | grep BAR $