ここからの続き

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

koie