重定向时输出不同


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

(其中的制表符位于每行字母数字字符之间)。

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


编辑: William Jackson答案说,这是mysql的功能:输出格式取决于输出是否被重定向。但是,这不能回答我的问题。mysql如何“知道”输出是否被重定向?重定向不只是获取输出,还可以将其重定向到某个地方吗?这不是MySQL看不见的吗?


-t标志添加到您的mysql命令中:)
spencer.sm 18-10-1,4

Answers:


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

1
我对覆盖默认值不感兴趣。¶我不知道输出的差异是由于mysql中的原因还是bash中的原因。但这并不能完全回答我的问题。mysql如何知道其输出正在发生什么?我认为重定向对于mysql应该是不可见的。我已经编辑了问题,以更清楚地说明我要问的意思。但是,+ 1可以很好地回答我(显然)似乎在问的问题。
msh210

啊,我误会了。我更新了答案。
威廉·杰克逊

嗯,有帮助。但这仍然不是我真正想要的,这是“ isatty'know'如何做到的?” 即,isatty由mysql调用。stdout是否是tty是bash的事实,而不是mysql。mysql如何知道bash中发生了什么?我认为bash中的内容对于mysql是不可见的。
msh210

1
Stdout是文件描述符,bash可以isatty()与任何其他程序一样使用,以确定它是指向tty还是指向磁盘上的文件。isatty()由操作系统提供,而不是bash。
威廉·杰克逊
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.