$ 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()
。您可以阅读源代码。
C
Stack Overflow 上有一些很好的例子(虽然不在):
- PHP的:如何在 PHP CLI 中检测 STDOUT 重定向?
- Python:如何检测 sys.stdout 是否连接到终端?
回答你的问题“为什么?”:因为这是文档所说的。请参阅参考手册:
以交互方式使用时,查询结果以 ASCII 表格式显示。以非交互方式使用时(例如,作为过滤器),结果以制表符分隔格式显示。
我怀疑这个决定是为了可读性。当以交互方式使用时,mysql
可以假设人类正在阅读输出,并且我们人类通常更容易阅读由这些行分隔的数据。当以非交互方式使用时,假设另一个程序将使用输出,并且制表符分隔的输出更容易以编程方式使用。
如果你有兴趣覆盖此默认设置并在重定向输出时获取 ASCII 表格式,则可以使用--table
(-t
)命令行选项:
mysql -t -e 'select a,b from tablefoo' databasename > file