Shell-Script

從 shell 腳本執行時如何在文件中擷取 MySQL 結果元數據

  • June 23, 2021

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

引用自:https://unix.stackexchange.com/questions/655405