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.txt
MySQL은 명령의 영향을 받는 행 수와 같은 메타데이터도 생성합니다 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