쉘 스크립트에서 실행할 때 파일에 MySQL 결과 메타데이터를 캡처하는 방법

쉘 스크립트에서 실행할 때 파일에 MySQL 결과 메타데이터를 캡처하는 방법

Linux(CentOS 7)의 쉘 스크립트에서 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.txtMySQL은 명령의 영향을 받는 행 수와 같은 메타데이터도 생성합니다 INSERT. .

답변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

그게 캡쳐할거야모든 것- 그런데 또 누군가는 그걸 원할 수도 있겠네요.


입력 제외

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

관련 정보