🎉

bashのallexport オプション

2022/02/23に公開

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