質問: True` を指定したので、私の作ったプログラムがリダイレクトを利用しているのだと理解できます。ということは `cmd.exe` は別の方法で `mysql.exe` とやり取りしているはずですが、それはどういったもので、VB.netから実行するときと何が違うのでしょうか? 両者ともアプリケーションが対話型コンソールアプリケーションを実行するという構図は同じように思えるのですが... よろしくご教示お願い致します。
回答: 一般的に コンソールアプリケーションは 標準入力(STDIN=キーボード)からデータを読み込み、標準出力(STDOUT=コンソール行) に出力しますが、これらの入出力を一時的に変更するのがリダイレクトです。リダイレクトはシェル(cmd.exe)が実施しますので、コンソールアプリケーション としては標準入力と標準出力を使うようにプログラミングされています。 ご質問の mysql.exe に限っては、標準入力と出力が、ターミナルコンソール(cmd.exe)であるかどうかを内部でチェックして、動作を制御しています。 client/mysql.cc ``` if (!isatty(0) || !isatty(1)) { status.batch=1; opt_silent=1; ignore_errors=0; } ``` `status.batch=1` は バッチモード を意味する変数です。 `opt_silent=1` は サイレントモード を意味する変数 `ignore_errors` は エラーを無視する変数を無効にしています。 > > VB.netから起動した mysql.exe は、正しくないコマンド列を受け取るとプロセスが終了してしまうようです。 > > > VB.netのことはよく分かりませんが、入力または出力をハンドリングするためにファイルか何かにリダイレクトしてるのだと思いますが、Mysql.exe はリダイレクトかどうかを独自に判断して、バッチモードで動くため、正しくないSQLはエラー終了するようになっています。