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 | 永続的 |















