我可以将错误保存在与标准输出相同的文件中。我已经使用了下面这个方法。问题是错误输出“总是”显示在顶部。在下面给出的示例中,错误与倒数第二个 sql 命令相关,其中无法保存值“india”。错误消息应显示在该语句旁边,而不是显示在文件顶部。
# 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
这实际上与 shell 无关,它是mysql
命令行实用程序的一个“功能”。
基本上,当 mysql 检测到输出没有发送到终端时,它会启用输出缓冲。这提高了性能。然而,程序显然将成功输出发送到 STDOUT,将错误输出发送到 STDERR(确实有意义),并为每个输出保留一个单独的缓冲区。
解决方案很简单,添加-n
到 mysql 命令参数中。-n
(或)选项--unbuffered
禁用输出缓冲。
例如:
mysql test -nvvf < import.txt >standard.txt 2>&1