Saída diferente ao redirecionar

9
$ mysql -e 'select a,b from tablefoo' databasename

rendimentos

+---+---+
| a | b |
+---+---+
| 1 | 0 |
| 2 | 1 |
+---+---+

enquanto

$ mysql -e 'select a,b from tablefoo' databasename > file

produz um arquivo file contendo

a b
1 0
2 1

(onde uma tabulação está entre os caracteres alfanuméricos em cada linha).

Eu acho que o redirecionamento não deve alterar a saída. Por que obtenho dois resultados diferentes?

Editar: William Jackson 's answer diz que esta é uma característica do mysql: o formato de saída depende se a saída está sendo redirecionada. Isso não responde à minha pergunta, no entanto. Como o mysql 'sabe' se a saída está sendo redirecionada? O redirecionamento não apenas pega a saída e, bem, a redireciona para algum lugar? Isso não deveria ser invisível para o mysql?

    
por msh210 31.10.2011 / 19:11

1 resposta

12

Editar: não posso ter certeza de que é assim que mysql o faz, mas pode estar usando isatty(3) para determinar se STDOUT é um terminal ou não, e modificando a saída de acordo.

Editar 2: A ferramenta de linha de comando mysql definitivamente usa isatty() . Você pode ler o código-fonte.

Há alguns bons exemplos disso (embora não em C ) no Stack Overflow:

Para responder à sua pergunta "Por quê?": porque é isso que a documentação diz. Veja o manual de referência :

When used interactively, query results are presented in an ASCII-table format. When used noninteractively (for example, as a filter), the result is presented in tab-separated format.

Eu suspeito que esta decisão foi tomada por legibilidade. Quando usado interativamente, mysql pode assumir que um humano está lendo a saída, e geralmente é mais fácil para nós humanos lermos os dados que são delimitados por essas linhas. Quando usado de forma não interativa, a suposição é que outro programa consuma a saída e que a saída delimitada por tabulação seja mais fácil de consumir programaticamente.

Se você estiver interessado em sobrescrever este padrão e obter o formato de tabela ASCII ao redirecionar a saída, você pode usar o --table ( -t ) opção de linha de comando :

mysql -t -e 'select a,b from tablefoo' databasename > file
    
por 31.10.2011 / 19:27