環境変数の環境とは
『 Linuxプログラミングインタフェース』6章では環境変数も扱われている。
プロセスごとに環境変数が設定されていて、Linux上では/proc/PID/environ
から、C言語上ではグローバル変数**environ
から取得する。
Python
os.environ
に辞書形式で取得できる。- 公式ドキュメント曰く、起動時のプロセスの環境変数が反映される。
- Pythonプログラム内で環境変数を変更する際は
os.environ
を直接編集するとPython側がよしなに対応してくれる。os.putenv()
で変更してもos.environ
の値は変更されない。
import os def main(): os.putenv("FOO", "BAR") os.environ["HOGE"] = "PIYO" for key, value in os.environ.items(): print(f"{key}={value}") if __name__ == "__main__": main()
実際に振る舞いを確かめてみる。
(venv) $> python3.7 display_env.py | grep FOO # 出ない! (venv) $> env FOO=BAR python3.7 display_env.py | grep FOO FOO=BAR (venv) $> python3.7 display_env.py | grep HOGE HOGE=PIYO
Rust
std::env::vars()
から取得できる。- 公式ドキュメント曰く、プログラム起動時(コンパイル時ではない)の環境変数を取得する。
- 環境変数の編集をするには
std::env::set_var()
やstd::env::remove_var()
関数、キーを指定して取得する場合はstd::env::var()
関数を使う。
use std::env; fn main() { let key = "FOO"; env::set_var(key, "BAR"); for (key, value) in env::vars() { println!("{}={}", key, value); } }
実際に振る舞いを確かめてみる。
(venv) $> target/debug/display_env | grep FOO FOO=BAR (venv) $> env HOGE=PIYO target/debug/display_env | grep HOGE HOGE=PIYO
感想
- The Twelve Factor Appを関わっている案件で導入して以来、環境変数との密接な付き合いが続いているが、環境変数の環境がどの範囲を示すのかを理解していなかった。環境とはプロセスごとにある。
- プログラム自体は大したことがないが、「プロセスごとに環境変数を持っている」という事実は今後の開発にものすごく役に立ちそうな気がしている。それだけ、今まで、ふわっと開発してきたことがわかる。