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?


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.