【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 $GREETINGsudo / 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.serviceDocker実行時の環境変数
# 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: infocronの環境変数
- デフォルトでは何も設定されていない
- シェルの設定ファイルは読まれない
# 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






