[ksh] パラメータが上書きされる?

とあるシェルスクリプトで、パラメータが取得できない!とヘルプが来たので、調べてみました。

どんな感じのシェルかというと…そのままは載せられないので、多少改変していますが、だいたいこんな感じ。

#!/bin/ksh
cd `/usr/bin/dirname $0`
export HOME=$PWD
. $HOME/ENV
SHID=`/usr/bin/basename $0`
. $HOME/cmd/myenv $SHID
echo $#
echo $1 $2 $3

これを何度試しても、パラメータがひとつしか取れず、しかもSHIDの値が出てくる、と。そんなことがあるのか!と試してみると、確かにSHIDの値が表示されるだけ。

2行目からひとつずつコメントアウトさせながら動きを見ていくと、どうやらmyenvを呼んでいるところをコメントアウトすると、正常に3つのパラメータが取得できる。逆にmyenvの行だけを有効にしたときでも、パラメータはひとつしか取れない。

ということで、myenvが原因と判明。でもこのファイルはSHIDを元にexportしているだけで、特に悪さをしているわけでもないのに…。

試しに、myenvを呼ぶ部分を関数にしてみると、今度は問題なく動く。

#!/bin/ksh
cd `/usr/bin/dirname $0`
export HOME=$PWD
. $HOME/ENV
SHID=`/usr/bin/basename $0`

function func_myenv {
    . $HOME/cmd/myenv $1
}

func_myenv $SHID
echo $#
echo $1 $2 $3

どうやら、メインシェルのパラメータ変数?を、サブシェルが上書きしてしまっている様子。だから関数内で実行させれば、メインシェルのパラメータが上書きされないので正常に動くのか…。

いやはや、目からウロコでした。

コメント

タイトルとURLをコピーしました