redireciona o erro para a saída padrão

3

Eu posso salvar o erro no mesmo arquivo como padrão. Eu usei esse método abaixo. O problema é que o erro é "sempre" mostrado no topo. No exemplo abaixo, o erro está relacionado ao segundo último comando sql, no qual o valor "india" não pode ser salvo. A mensagem de erro deve ser mostrada ao lado dessa declaração e não na parte superior do arquivo.

# 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

A saída esperada será algo como isto ...

# 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

O erro deve ser colocado exatamente ao lado da declaração a que se refere. Ou então o arquivo de saída redirecionado não é útil.

    
por shantanuo 26.11.2013 / 06:56

1 resposta

9

Isso realmente não tem nada a ver com o shell, é um 'recurso' do utilitário de linha de comando mysql .

Basicamente, quando o mysql detecta que a saída não está indo para um terminal, ele habilita o buffer de saída. Isso melhora o desempenho. No entanto, o programa aparentemente envia a saída de sucesso para STDOUT, e a saída de erro para STDERR (faz sentido realmente), e mantém um buffer separado para cada um.

A solução é simplesmente adicionar -n aos argumentos do comando mysql. A opção -n (ou --unbuffered ) desativa o buffer de saída.

Por exemplo:

mysql test -nvvf  < import.txt  >standard.txt 2>&1
    
por 26.11.2013 / 07:57