name=value command 構文
commandのところをいろいろ変えて、コマンド行での変数代入が永続的かどうか調べてみた。
- nullコマンド(built-in)
- trueコマンド(freebsd shとdashではbuilt-in、bashでは外部コマンド→うそでしたbuilt-inでした)
- ユーザ定義関数
- 外部コマンド
テストスクリプト
X1=YES : echo "X1=${X1-NO}" printenv X1 X2=YES true echo "X2=${X2-NO}" printenv X2 g() { : } X3=YES g echo "X3=${X3-NO}" printenv X3 X4=YES cal >/dev/null echo "X4=${X4-NO}" printenv X4 f() { X=FUNC } X=CMD f echo "X=${X-NO}" printenv X
fbsd sh
X1=YES X2=NO X3=NO X4=NO X=NO
bash
X1=NO X2=NO X3=NO X4=NO X=NO
bash -o posix
X1=YES YES X2=NO X3=YES YES X4=NO X=FUNC FUNC
dash
X1=YES X2=NO X3=YES X4=NO X=FUNC
結果
永続的か?
Shell | nullコマンド | 関数 | trueコマンド | 外部コマンド |
---|---|---|---|---|
fbsd sh | YES | NO | NO | NO |
bash | NO | NO | NO | NO |
bash -o posix | YES+環境変数 | YES+環境変数 | NO | NO |
dash | YES | YES | NO | NO |
コマンド行の代入と呼ばれた関数内での代入の競合は?
Shell | 結果 |
---|---|
fbsd sh | 永続的でない |
bash | 永続的でない |
bash -o posix | 永続的+環境変数 |
dash | 永続的 |