標準出力と同じファイルにエラーを保存できます。私は次の方法を使用しました。問題は、エラー出力が「常に」の上に表示されることです。以下の例では、エラーは「india」値を格納できない2番目のsqlコマンドに関連しています。エラーメッセージは、ファイルの上部ではなくステートメントの横に表示する必要があります。
# cat import.txt
drop table if exists testme;
create table testme (id int , name varchar(255));
insert into testme values (1, 'abc');
insert into testme values (2, 'abc', 'india');
insert into testme values (3, 'xyz');
# mysql test -vvf < import.txt >standard.txt 2>&1
# cat standard.txt
ERROR 1136 (21S01) at line 5: Column count doesn't match value count at row 1
--------------
drop table if exists testme
--------------
Query OK, 0 rows affected
--------------
create table testme (id int , name varchar(255))
--------------
Query OK, 0 rows affected
--------------
insert into testme values (1, 'abc')
--------------
Query OK, 1 row affected
--------------
insert into testme values (2, 'abc', 'india')
--------------
--------------
insert into testme values (3, 'xyz')
--------------
Query OK, 1 row affected
予想される出力は次のとおりです。
# mysql test -vvf < import.txt
--------------
drop table if exists testme
--------------
Query OK, 0 rows affected
--------------
create table testme (id int , name varchar(255))
--------------
Query OK, 0 rows affected
--------------
insert into testme values (1, 'abc')
--------------
Query OK, 1 row affected
--------------
insert into testme values (2, 'abc', 'india')
--------------
ERROR 1136 (21S01) at line 4: Column count doesn't match value count at row 1
--------------
insert into testme values (3, 'xyz')
--------------
Query OK, 1 row affected
エラー出力は、関連するステートメントのすぐ隣に配置する必要があります。それ以外の場合、リダイレクトされた出力ファイルは役に立ちません。
答え1
これは実際にはシェルとは何の関係もなく、mysql
コマンドラインユーティリティの「機能」です。
デフォルトでは、mysqlは出力が端末に送信されないことを検出すると出力バッファリングを有効にします。これによりパフォーマンスが向上します。ただし、プログラムは明らかに成功出力をSTDOUTに送信し、エラー出力をSTDERRに送信し(これは意味があります)、各出力ごとに別々のバッファを保持します。
解決策は簡単です。-n
mysqlコマンドパラメータに追加するだけです。-n
(または) オプションは出力--unbuffered
バッファリングをディセーブルにします。
たとえば、
mysql test -nvvf < import.txt >standard.txt 2>&1