環境変数とエクスポート

シェル変数と環境変数

通常の変数(シェル変数)と、子プロセスに引き継がれる環境変数の違いです。

code
# 子プロセス用のスクリプトを作成
cat << 'EOF' > child.sh
echo "子プロセス : VAR1=${VAR1:-未定義}"
echo "子プロセス : VAR2=${VAR2:-未定義}"
EOF

echo 'シェル変数は子プロセスに引き継がれない'
VAR1="りんご"
echo "親プロセス : VAR1=${VAR1}"
bash child.sh

echo '------------------------------'
echo 'export した変数は子プロセスに引き継がれる'
export VAR2="みかん"
echo "親プロセス : VAR2=${VAR2}"
bash child.sh
stdout
シェル変数は子プロセスに引き継がれない
親プロセス : VAR1=りんご
子プロセス : VAR1=未定義
子プロセス : VAR2=未定義
------------------------------
export した変数は子プロセスに引き継がれる
親プロセス : VAR2=みかん
子プロセス : VAR1=未定義
子プロセス : VAR2=みかん

環境変数の表示

設定されている環境変数を表示、または宣言形式で確認します。

code
export VAR1="apple"
export VAR2="orange"

echo 'printenv は設定されている環境変数の一覧を表示'
printenv | grep -E '^(VAR1|VAR2)='

echo '------------------------------'
echo '引数を指定するとその変数の値のみを表示'
printenv VAR1

echo '------------------------------'
echo 'export -p は環境変数を宣言形式で表示'
export -p | grep -E '(VAR1|VAR2)='
stdout
printenv は設定されている環境変数の一覧を表示
VAR1=apple
VAR2=orange
------------------------------
引数を指定するとその変数の値のみを表示
apple
------------------------------
export -p は環境変数を宣言形式で表示
declare -x VAR1="apple"
declare -x VAR2="orange"

日本語の値とエスケープ

マルチバイト文字(日本語)を扱う場合の出力の違いです。

code
export VAR1="りんご"

echo 'printenv はそのまま表示される'
printenv VAR1

echo '------------------------------'
echo 'export -p はエスケープされた形式で表示される'
export -p | grep VAR1
stdout
printenv はそのまま表示される
りんご
------------------------------
export -p はエスケープされた形式で表示される
declare -x VAR1=$'\343\202\212\343\202\223\343\201\224'

エクスポート属性の取り消し

export -n を使うと、変数は保持したままエクスポート属性のみを取り消すことができます。

code
# 子プロセス用のスクリプトを作成
cat << 'EOF' > child.sh
echo "子プロセス : VAR1=${VAR1:-未定義}"
EOF

echo '変数をエクスポートした状態'
export VAR1="りんご"
bash child.sh

echo '------------------------------'
echo 'export -n でエクスポート属性のみを取り消す'
export -n VAR1

echo "親プロセス : VAR1=${VAR1}(現在のシェルでは値は保持される)"
bash child.sh
stdout
変数をエクスポートした状態
子プロセス : VAR1=りんご
------------------------------
export -n でエクスポート属性のみを取り消す
親プロセス : VAR1=りんご(現在のシェルでは値は保持される)
子プロセス : VAR1=未定義

コマンド実行時のみの環境変数

コマンドの直前に変数を記述することで、そのコマンドの実行時のみ有効な環境変数を渡すことができます。

code
echo 'コマンドの直前に変数を記述するとその実行時のみ有効になる'
VAR1="こんにちは" bash -c 'echo "VAR1 : ${VAR1}"'

echo '------------------------------'
echo '現在のシェルには影響しない'
echo "VAR1 : ${VAR1:-未定義}"
stdout
コマンドの直前に変数を記述するとその実行時のみ有効になる
VAR1 : こんにちは
------------------------------
現在のシェルには影響しない
VAR1 : 未定義