シェル変数と環境変数
通常の変数(シェル変数)と、子プロセスに引き継がれる環境変数の違いです。
# 子プロセス用のスクリプトを作成
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
環境変数の表示
設定されている環境変数を表示、または宣言形式で確認します。
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)='
日本語の値とエスケープ
マルチバイト文字(日本語)を扱う場合の出力の違いです。
export VAR1="りんご"
echo 'printenv はそのまま表示される'
printenv VAR1
echo '------------------------------'
echo 'export -p はエスケープされた形式で表示される'
export -p | grep VAR1
エクスポート属性の取り消し
export -n を使うと、変数は保持したままエクスポート属性のみを取り消すことができます。
# 子プロセス用のスクリプトを作成
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
コマンド実行時のみの環境変数
コマンドの直前に変数を記述することで、そのコマンドの実行時のみ有効な環境変数を渡すことができます。
echo 'コマンドの直前に変数を記述するとその実行時のみ有効になる'
VAR1="こんにちは" bash -c 'echo "VAR1 : ${VAR1}"'
echo '------------------------------'
echo '現在のシェルには影響しない'
echo "VAR1 : ${VAR1:-未定義}"