msh*_*210 10 bash mysql redirection stdout
$ mysql -e 'select a,b from tablefoo' databasename
Run Code Online (Sandbox Code Playgroud)
产量
+---+---+
| a | b |
+---+---+
| 1 | 0 |
| 2 | 1 |
+---+---+
Run Code Online (Sandbox Code Playgroud)
然而
$ mysql -e 'select a,b from tablefoo' databasename > file
Run Code Online (Sandbox Code Playgroud)
产生一个file包含
a b
1 0
2 1
Run Code Online (Sandbox Code Playgroud)
(其中一个制表符位于每行的字母数字字符之间)。
我认为重定向不应该改变输出。为什么我得到两个不同的结果?
编辑: 威廉杰克逊的回答说这是 mysql 的一个特性:输出格式取决于输出是否被重定向。不过,这并不能回答我的问题。mysql 如何“知道”输出是否被重定向?重定向是否不仅获取输出,而且还重定向到某个地方?那不应该对mysql不可见吗?
Wil*_*son 13
编辑:我不能确定这是怎么mysql做的,但它可以isatty(3)用来确定是否STDOUT是终端,并相应地修改输出。
编辑2:在mysql命令行工具肯定使用isatty()。您可以阅读源代码。
C在 Stack Overflow 上有一些很好的例子(虽然不在):
回答你的问题,“为什么?”:因为这是文档所说的。请参阅参考手册:
以交互方式使用时,查询结果以 ASCII 表格式显示。当以非交互方式使用时(例如,作为过滤器),结果以制表符分隔的格式显示。
我怀疑这个决定是为了可读性。当以交互方式使用时,mysql可以假设人类正在阅读输出,并且我们人类通常更容易阅读由这些行分隔的数据。当以非交互方式使用时,假设另一个程序将使用输出,并且制表符分隔的输出更容易以编程方式使用。
如果您有兴趣在重定向输出时覆盖此默认值并获取 ASCII 表格式,您可以使用--table( -t) 命令行选项:
mysql -t -e 'select a,b from tablefoo' databasename > file
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2708 次 |
| 最近记录: |