从 shell 脚本运行时如何捕获文件中的 MySQL 结果元数据

从 shell 脚本运行时如何捕获文件中的 MySQL 结果元数据

我正在 Linux (CentOS 7) 中从 shell 脚本运行 MySQL 脚本文件。虽然我可以捕获文件中的结果,但无法捕获结果元数据。

例子:

我的test.sql文件如下所示:

USE dbname;
SELECT * FROM `test`;
INSERT INTO test values (3,'Test');

我的test.sh脚本如下所示:

#!/bin/bash
    
mysql --password=<pwd> --user=<username> --host=<host domain> < test.sql > out.txt

当我从命令行执行 test.sh 时,我可以捕获out.txt.但 MySQL 还会生成元数据,例如受命令影响的行数,例如INSERT.我无法捕获最后一个 SQL 命令的信息(请参阅上面的 SQL 文件示例)。

答案1

您可以增加详细程度。这应该足够了:

-vv

原因:

它检查isatty如果发现它没有打印到终端,则进入批处理模式。man和 的详细程度--help

--verbose 
 -v       Verbose mode. Produce more output about what the program
          does. This option can be given multiple times to produce
          more and more output. (For example, -v -v -v produces 
          table output format even in batch mode.)

--batch
-B        Print results using tab as the column separator, with each
          row on a new line. With this option, mysql does not use 
          the history file.

          Batch mode results in nontabular output format and escaping
          of special characters. Escaping may be disabled by using 
          raw mode; see the description for the --raw option.

取决于您想要什么,您可能也想要--raw


追兔子

否则就必须伪造tty,例如使用script

0<&- script -qefc "mysql -u user --password='xxx' --host=host"< test.sql >out.txt

那会捕获一切- 但话又说回来,有人可能想要那个。


排除输入

对于使用库的程序isatty(),并且没有为此覆盖标志,tty也可以通过这种方式伪造; (编译一个最小的 C 代码片段):

echo 'int isatty(int fd) { return 1; }' | \
gcc -O2 -fpic -shared -ldl -o faketty.so -xc -

strip faketty.so # not needed, but ...

chmod 400 faketty.so # not needed, but ...

然后运行:

LD_PRELOAD=./faketty.so mysql -u user --password='xxx' --host=host< test.sql >out.txt

或者添加一个外壳包装器,例如faketty

#! /bin/sh -
LD_PRELOAD=/path/to/faketty.so "$@"

然后

$ faketty mysql ... < foo >bar

相关内容