Saída diferente ao redirecionar

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

rendimentos

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

enquanto que

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

produz um arquivo filecontendo

a b
1 0
2 1

(onde uma guia 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?


Edit: A resposta de William Jackson diz que este é um recurso do mysql: 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 pega apenas a saída e, bem, redireciona-a para algum lugar? Isso não deveria ser invisível para o mysql?

msh210
fonte
Adicione a -tflag ao seu comando mysql :)
spencer.sm

Respostas:

13

Edit: Não posso ter certeza de que é assim mysql, mas pode ser usado isatty(3)para determinar se STDOUTé um terminal ou não e modificar a saída de acordo.

Edit 2: A mysqlferramenta de linha de comando definitivamente usa isatty(). Você pode ler o código fonte.

Existem alguns bons exemplos disso (embora não estejam C) no Stack Overflow:


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

Quando usados ​​interativamente, os resultados da consulta são apresentados em um formato de tabela ASCII. Quando usado de maneira não interativa (por exemplo, como um filtro), o resultado é apresentado em formato separado por tabulação.

Eu suspeito que essa decisão foi tomada para facilitar a leitura. Quando usado de forma interativa, mysqlpode assumir que um humano está lendo a saída, e geralmente é mais fácil para nós, humanos, ler dados que são delimitados por essas linhas. Quando usado de forma não interativa, a suposição é que outro programa consumirá a saída e que a saída delimitada por tabulação é mais fácil de consumir programaticamente.

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

mysql -t -e 'select a,b from tablefoo' databasename > file
William Jackson
fonte
1
Não estou interessado em substituir o padrão. ¶ Eu não sabia se a diferença na saída era devido a algo no mysql ou devido a algo no bash. Mas isso não responde totalmente à minha pergunta. Como o mysql sabe o que está acontecendo com sua saída? Eu acho que o redirecionamento deve ser invisível para o mysql. Editei a pergunta para declarar mais claramente o que pretendo perguntar. +1, no entanto, por responder muito bem à pergunta que eu (aparentemente) parecia estar fazendo.
Msh210 31/12/11
Ah, eu entendi errado. Eu atualizei minha resposta.
William Jackson
Ah, isso ajuda. Mas ainda não é exatamente o que eu quero, que é "como isatty 'sabe'?" Ou seja, isatty é chamado pelo mysql. Se stdout é um tty é um fato da vida no bash, não no mysql. Como o mysql sabe o que está acontecendo no bash? Eu acho que as coisas no bash seriam invisíveis para o mysql.
Msh210 31/10/11
1
Stdout é um descritor de arquivo e bashpode usar isatty()o mesmo que qualquer outro programa para determinar se está apontando para um tty ou um arquivo no disco. isatty()é fornecido pelo sistema operacional, não pelo bash.
William Jackson