リダイレクト時の異なる出力


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

収量

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

一方

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

file含むファイルを生成します

a b
1 0
2 1

(タブは各行の英数字の間にあります)。

リダイレクトによって出力が変わることはないと思います。なぜ2つの異なる結果が得られるのですか?


編集: ウィリアムジャクソン答えは、これはmysqlの機能であると言います。出力形式は、出力がリダイレクトされるかどうかによって異なります。しかし、これは私の質問には答えません。mysqlは出力がリダイレクトされているかどうかをどのように「認識」しますか?リダイレクトは単に出力を取得するだけでなく、どこかにリダイレクトしますか?それはmysqlから見えないはずではありませんか?


-tmysqlコマンドにフラグを追加します:)
spencer.sm

回答:


13

編集:これがどのように行われるかはわかりmysqlませんが、ターミナルisatty(3)かどうかを判断しSTDOUT、それに応じて出力を変更するために使用できます。

編集2:mysqlコマンドラインツールは間違いなく使用していますisatty()ソースコードを読むことができます。

CStack Overflowには、これの良い例がいくつかあります(ただし、にはありません)。


あなたの質問に答えるために、「なぜ?」:それはドキュメントが言っていることだからです。リファレンスマニュアルを参照してください

インタラクティブに使用すると、クエリ結果はASCIIテーブル形式で表示されます。非対話的に(たとえば、フィルターとして)使用すると、結果はタブ区切り形式で表示されます。

この決定は読みやすさのためになされたのではないかと思います。インタラクティブに使用mysqlすると、人間が出力を読んでいると想定できます。一般に、人間がこれらの行で区切られたデータを読み取る方が簡単です。非対話的に使用すると、別のプログラムが出力を消費することが想定され、そのタブ区切りの出力はプログラムで消費する方が簡単です。

このデフォルトを上書きして出力をリダイレクトするときにASCIIテーブル形式を取得することに関心がある場合は、--table-t)コマンドラインオプションを使用できます

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

1
デフォルトを上書きすることに興味はありません。¶出力の違いがmysqlにあるのか、bashにあるのか、わかりませんでした。しかし、これは私の質問に完全に答えるものではありません。mysqlはその出力で何が起こっているかをどのようにして知るのですか?私はリダイレクトがmysqlから見えないようにすべきだと思います。質問を編集して、質問の意味をより明確に示しました。非常にうまく、私は(明らかに)質問応答のための1、しかし、思え尋ねることをします。
msh210 2011年

あ、誤解しました。回答を更新しました。
ウィリアムジャクソン

ああ、それは役に立ちます。しかし、それは私が本当に望んでいることではありません。つまり、isattyはmysqlによって呼び出されます。stdoutがttyであるかどうかは、mysqlではなくbashでの現実です。MySQLはbashで何が行われているのかをどのようにして知るのですか?私はbashにあるものはmysqlから見えないだろうと思います。
msh210 2011年

1
stdoutはファイル記述子であり、他のプログラムと同じようにbash使用isatty()して、ttyを指しているのか、ディスク上のファイルを指しているのかを判別できます。isatty()OSによって提供され、bashではありません。
ウィリアムジャクソン、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.