vine-users ML アーカイブ



[vine-users:053813] Re: bash 起動時に環境変数 i だけが消えてしまう

  • From: ueda@xxxxxxxxxxxxxxxxxx
  • Subject: [vine-users:053813] Re: bash 起動時に環境変数 i だけが消えてしまう
  • Date: Thu, 26 Sep 2002 16:55:36 +0900
上田です。

>> i といういかにもユーザが使いそうな変数を消されてしまうのが悩ましいです。

大里> たとえば、ユーザ名_ENV_i とか、サブシステム名_value_i などだった
大里> ら、いかにもユーザが使いそうな環境変数名ではありますが、
大里>   for i in foo; do bar; done
大里> は、あまりにポピュラーな常套句なので、export i などとやばいこと
大里> をするユーザがいるとは、私には信じられませんけど。

うーん。どっちがヤバいかは、議論が分かれる気がします。
ポピュラーな常套句だけに、システムが勝手にそれを使って(変更して)
良いのかという気がするんです。

今回問題の発端となったのは、PBS(バッチジョブを投入するシステム) のqsub
コマンドを使うスクリプトでした。
=========================
for i in 1 2 3 4 5; do
    for j in 1 2 3 4 5; do
	qsub -v i,j 変数iとjを使うバッチスクリプト
    done
done
=========================
qsub は -v 変数名 と書くと環境変数を中のバッチジョブに渡してくれるので
すが(というかそれ以外に情報を渡す手段がない)、j はちゃんと伝わるのに、
i だけ伝わらないという非常に分かりにくいバグが出たのです。

どの変数名が伝わらなくてどの変数が伝わるのか、PBSの問題なのかrshの問題
なのか、なぜ変数 i なのか、かなり悩みました。

大里> この衝突を心配するなら、すべての環境変数をなくすか、シェル変数の
大里> 使用を一切禁止するかしかないという変な話になるので?

ええと、変じゃないです。可能なら一切禁止したいです。
正確に言うと、 /etc/bashrc や /etc/profile のようにユーザが意識せずに
使う(使ってしまう)スクリプトでは、できるだけユーザの環境変数やシェル変
数を汚さないようにした方がよいと考えています。変ですか?

ちなみに RedHat でも調べてみましたが、 $i 使ってますね。しかも unset 
しないから、/etc/profile.d/xxx.sh なんて値が入っている。
# これは、むしろ原因が分かりやすいけど汚いなぁ。

>> もしも次のバージョンでもbash2でなくbashを標準のshellとするなら、修正を
>> 検討して頂けると嬉しいです。

大里> bash2 でも一緒じゃないですか?

bash2 でも一緒でした。私の勘違いです。

--HAL
========================================================================
(株)富士通研究所 ITコア研究所 ITアーキテクチャ研究部 上田晴康
E-mail: hal_ueda@xxxxxxxxxxxxxx
========================================================================