18) DOS窓の環境変数とパイプの関係 だうらんど 2002/02/25(月) 16:19 |
|
始めまして。だうらんどと申します。 ちょっと説明しにくいのですが、DOS窓の環境変数とパイプの関係で悩んでいます。環境は、WinNT4.0 SP6です。 例えば、次の様な、二つのバッチファイルを作成します。 *--- test1.bat ---* @echo off set aaa=0 echo %aaa% echo. call TEST2 echo. echo %aaa% *--- test2.bat ---* @echo off SET aaa=1 echo 2222 echo %aaa% echo 3333 test1.batを実行すると、DOS窓の表示は次のようになります。 0 2222 1 3333 1 ここで、test1.batでtest2.batをcallしている行を、 call TEST2 | sort と変えて実行すると、そのDOS窓の表示は 0 1 2222 3333 0 となり、最後のaaaの値が0になってしまいます。 パイプを入れた事で、test2.batで行われているaaaへの代入が、test1.batに戻った時点で無視されているようなのですが、これを防ぐ方法はあるのでしょうか。よろしくお願いいたします。 |
|
|
20) Re:DOS窓の環境変数とパイプの関係 SYSOP YanaKen 2002/02/26(火) 00:08 |
|
だうらんどさん こんにちは。 》ちょっと説明しにくいのですが、 確かにわかりにくかったです(^^;。途中にsortコマンドが出てくるぶん話がなおさらややこしくなってますが、核心はパイプ処理の仕様であって、呼ばれるのがsortコマンドであることは本質ではないようなので、ぼくなりにもっと一般化したサンプルを考えてみました。 :mother.bat @set aaa=● @echo 現在、環境変数aaaは"%aaa%"です。 @call child.bat @echo 現在、環境変数aaaは"%aaa%"です。 :child.bat @SET aaa=◎ @echo %0 は環境変数aaaを "%aaa%" にセットしました。 《実行結果》 >> 現在、環境変数aaaは"●"です。 >> child.bat は環境変数aaaを "◎" にセットしました。 >> 現在、環境変数aaaは"◎"です。 ⇒さてここでmother.batの3行めにパイプ処理を入れ、@call child.bat | more としてみると、 >> 現在、環境変数aaaは"●"です。 >> child.bat は環境変数aaaを "◎" にセットしました。 >> (1行改行が発生) >> 現在、環境変数aaaは"●"です。 ……と、確かに環境変数は元に戻ってしまいます。(Windows2000で確認) この現象はしかし、callが存在しなかった時期からDOSを使ってた人間にはおなじみでして(^^;、かつてバッチファイルからバッチファイルを呼び出すには"command /c コマンド..."の書式が常道でした。で、この場合、呼ばれた子プロセスで変更された環境変数は、元のバッチファイルではきれいさっぱり消えるのが普通でした。 そういうわけで、パイプ処理が指定されると、実際の処理としては、 command /c call child.bat ……みたいに、いったん子プロセスが呼び出される状況が起きるのだと思われます。 と、前置きが長くなりましたが、そんなわけで、直接にこの現象を起こさせなくすることは無理っぽいですが、実践的な解決方法としては「要はパイプを使わなければよい」わけで、次のように、処理を2つに分けるやりかたが考えられると思います。 @call child.bat >temp.txt @sort <temp.txt YanaKen |
|
|
22) Re2:DOS窓の環境変数とパイプの関係 だうらんど 2002/02/26(火) 20:14 |
|
Yanakenさん、ありがとうございます。 私の、わかりにくい説明を解説までしていただいて! >この現象はしかし、callが存在しなかった時期からDOSを使ってた人間にはおなじみでして(^^;、 そのような由来(?)があるんですね・・・。 >そんなわけで、直接にこの現象を起こさせなくすることは無理っぽいですが、実践的な解決方法としては「要はパイプを使わなければよい」わけで、次のように、処理を2つに分けるやりかたが考えられると思います。 うーん、そうなんですね。どうもUNIXをかじっていた人間には、納得し辛いところなのですが、「それがDOS窓だ!」と思うしかないのでしょうね。 ありがとうございました。 |