🎉
bashのallexport オプション
bash の -a (--allexport)オプションについて知らなかったのでまとめ。
bash -a (allexport) オプションとは
man bashより抜粋
set [+abefhkmnptuvxBCEHPT] [+o option-name] [arg ...]
Without options, the name and value of each shell variable are displayed in a format that can be reused as input for setting or resetting the currently-set variables.
Read-only variables cannot be reset. In posix mode, only shell variables are listed. The output is sorted according to the current locale. When options are speci‐
fied, they set or unset shell attributes. Any arguments remaining after option processing are treated as values for the positional parameters and are assigned, in
order, to $1, $2, ... $n. Options, if specified, have the following meanings:
-a Each variable or function that is created or modified is given the export attribute and marked for export to the environment of subsequent commands.
...
-o option-name
The option-name can be one of the following:
allexport
Same as -a.
...
ということで、-a オプションとは allexport の意味で、新規作成したり変更したりした変数や関数がすべてexport扱いになる。
動作例
以下のようなスクリプトを準備する。
TEST変数とSAMPLE変数を設定して出力するだけ。TESTのみexportする。
bash-allexport.sh
#!/bin/bash
export TEST=test
echo "TEST=$TEST"
SAMPLE=sample
echo -e "SAMPLE=$SAMPLE\n"
これを allexport オプションなしで実行すると以下の通り。
すなわち、exportしたTEST変数は後続のenvコマンド実行時にも反映されているが、SAMPLE変数は反映されていない。これはexportの通常の挙動。
$ bash -c "source bash-allexport.sh; env | grep -e 'TEST' -e 'SAMPLE'"
TEST=test
SAMPLE=sample
TEST=test
一方で、 allexportオプションありで実行すると以下の通り。
すなわち、exportしていないSAMPLE変数もexportされた扱いとなり、スクリプトを抜けた後も設定が残ってしまう。これにより意図しない変数が設定されてしまい、実行環境が簡単に壊れてしまう。
$ bash -a -c "source bash-allexport.sh; env | grep -e 'TEST' -e 'SAMPLE'"
TEST=test
SAMPLE=sample
SAMPLE=sample
TEST=test
まとめ
bash の -a (allexport) オプションの使用は慎重に。
Discussion