ksh の typeset は bash とは互換が無いので注意2019年08月15日 12時06分23秒

ksh には typeset を使って、ローカル変数を関数内に作ることができる。これを用いると、グローバル変数として同じ名前があったとしても、そちらには影響がない。

bash にも typeset というコマンドはあるが、一部動作が違うものがあるようだ。ksh とは異なり、グローバル変数をそのまま使ってしまうので、ksh スクリプトを bash で実行すると動作が変わってしまう事があるので注意が必要。Linux の sh や ksh は実態が bash だったりすることが多いので更に注意。

簡単な実証コード。

% cat var.sh
set_var()
{ 
    typeset -t var 
    var=local
    echo "var = $var" 
} 

typeset var=global 

echo "var = $var" 
set_var 
echo "var = $var"
ローカル変数として扱われていた場合の出力がこちら。
% ksh var.sh
var = global
var = local 
var = global 
グローバル変数として使われていたら以下のような出力になる。
var = global 
var = local 
var = local
手元で、更に追加実験をしていたら bash でもしっかりとローカル変数として扱っていたのも見付けた。bash のバージョンにも依るのかも知れない。