我正在 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