とあるシェルスクリプトで、パラメータが取得できない!とヘルプが来たので、調べてみました。
どんな感じのシェルかというと…そのままは載せられないので、多少改変していますが、だいたいこんな感じ。
#!/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
どうやら、メインシェルのパラメータ変数?を、サブシェルが上書きしてしまっている様子。だから関数内で実行させれば、メインシェルのパラメータが上書きされないので正常に動くのか…。
いやはや、目からウロコでした。
コメント