何かを書き留める何か

数学や読んだ本について書く何かです。最近は社会人として生き残りの術を学ぶ日々です。

『 Linuxプログラミングインタフェース』を気合いで読む会 第6回:6章プロセス:環境変数の表示

環境変数の環境とは

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を関わっている案件で導入して以来、環境変数との密接な付き合いが続いているが、環境変数の環境がどの範囲を示すのかを理解していなかった。環境とはプロセスごとにある。
  • プログラム自体は大したことがないが、「プロセスごとに環境変数を持っている」という事実は今後の開発にものすごく役に立ちそうな気がしている。それだけ、今まで、ふわっと開発してきたことがわかる。