Shell-Script
從 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 文件範例)。
您可以增加詳細程度。這應該足夠了:
-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
這將擷取所有內容- 但有人可能想要那個。
排除輸入
對於使用 library 的程序
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