【linux】環境変数についてのあれこれ

スポンサーリンク

※このページにはプロモーションが含まれています。当サイトは各種アフィリエイトプログラムから一定の収益を得ています。

環境変数の一覧表示・設定・削除

 

# 1. 環境変数の一覧を表示
printenv
# 特定の変数(例:PATH)だけを表示
printenv PATH
# または echo で表示(変数の前に $ をつける)
echo $PATH

# 2. 一時的な設定(現在のセッションのみ有効)
export MY_VAR="Hello World"
echo $MY_VAR

# 3. 削除
unset MY_VAR
echo $MY_VAR  # 何も表示されなくなる

環境変数とシェル変数の違い

  • シェル変数・・・そのシェル内だけで有効
  • 環境変数・・・exportすることで子プロセスにも引き継がれる
# シェル変数を設定
MY_SHELL_VAR="Only here"

# 環境変数を設定
export MY_ENV_VAR="Everywhere"

# 確認
echo "Shell Var: $MY_SHELL_VAR"
echo "Env Var: $MY_ENV_VAR"

# 別のシェル(子プロセス)を起動して確認
bash -c 'echo "In subshell - Shell Var: $MY_SHELL_VAR"; echo "In subshell - Env Var: $MY_ENV_VAR"'
# 結果: Shell Var は空になり、Env Var だけが表示される

永続化の方法

exportした環境変数はログアウトで消えてしまう。

  • Bashの場合・・・~/.bashrc(個人の設定)
  • システム全体・・・/etc/environment

 

# ~/.bashrc の末尾に追記する例
echo 'export GREETING="Hello Linux"' >> ~/.bashrc

# 設定を即座に現在のシェルに反映させる
source ~/.bashrc

# 確認
echo $GREETING

sudo / sudo su の時の引継ぎ

基本的に引き継がれない。

 

export MY_SECRET="12345"

# 通常の sudo では引き継がれない(空になる)
sudo printenv MY_SECRET

# 引き継ぐ方法 A: -E (Preserve Environment) オプションを使う
sudo -E printenv MY_SECRET

# 引き継ぐ方法 B: sudo su (現在の環境を維持しようとする ※OS設定による)
sudo su
echo $MY_SECRET

# 引き継がれないケース: sudo su - (ログインシェルとして起動。環境がリセットされる)
sudo su -
echo $MY_SECRET # 表示されない

よくある注意点

  • PATHの追加方法: export PATH=$PATH:/new/path のように、既存の値を壊さない書き方。
  • クォーテーションの扱い: スペースを含む値を設定する際のシングル/ダブルクォートの使い分け

systemdの環境変数

  • ログインシェルの環境変数は基本的に引き継がれない

  • systemd 独自に環境変数を定義する必要がある

# /etc/systemd/system/sample.service
[Service]
Environment=APP_ENV=prod
Environment=JAVA_HOME=/usr/lib/jvm/java-17
ExecStart=/usr/bin/java -jar app.jar

# 反映後は再起動
sudo systemctl daemon-reload
sudo systemctl restart sample.service

Docker実行時の環境変数

 

# docker runで渡す
docker run -e APP_ENV=prod -e LOG_LEVEL=info myapp

# envファイルを使う
# app.env
APP_ENV=prod
DB_HOST=db

docker run --env-file app.env myapp

# docker compose
services:
  app:
    image: myapp
    environment:
      APP_ENV: prod
      LOG_LEVEL: info

cronの環境変数

  • デフォルトでは何も設定されていない
  • シェルの設定ファイルは読まれない

 

# crontabで設定
crontab -e

APP_ENV=prod
PATH=/usr/local/bin:/usr/bin:/bin

# cronではなく、実行するshに設定
#!/bin/bash
export APP_ENV=prod
export JAVA_HOME=/usr/lib/jvm/java-17

/usr/bin/java -jar app.jar

* * * * * /usr/bin/java -jar /opt/app/app.jar

* * * * * /opt/app/run.sh

スポンサーリンク

linux