重定向时输出不同

重定向时输出不同
$ 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

(每行字母数字字符之间有一个制表符)。

我认为重定向不应该改变输出。为什么我得到了两个不同的结果?


编辑: 威廉·杰克逊回答说这是 mysql 的一个功能:输出格式取决于输出是否被重定向。但这并没有回答我的问题。mysql 如何“知道”输出是否被重定向?重定向不只是获取输出并将其重定向到某个地方吗?这对 mysql 来说不应该是不可见的吗?

答案1

编辑:我不能确定这是如何mysql做到的,但它可能是使用isatty(3)确定是否STDOUT是终端,并相应地修改输出。

编辑2:命令mysql行工具肯定使用isatty()您可以阅读源代码。

CStack Overflow 上有一些很好的例子(虽然不在):


回答你的问题“为什么?”:因为这是文档所说的。请参阅参考手册

以交互方式使用时,查询结果以 ASCII 表格式显示。以非交互方式使用时(例如,作为过滤器),结果以制表符分隔格式显示。

我怀疑这个决定是为了可读性。当以交互方式使用时,mysql可以假设人类正在阅读输出,并且我们人类通常更容易阅读由这些行分隔的数据。当以非交互方式使用时,假设另一个程序将使用输出,并且制表符分隔的输出更容易以编程方式使用。

如果你有兴趣覆盖此默认设置并在重定向输出时获取 ASCII 表格式,则可以使用--table-t)命令行选项

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

相关内容