리디렉션 할 때 다른 출력


10
$ mysql -e 'select a,b from tablefoo' databasename

수확량

+---+---+
| a | b |
+---+---+
| 1 | 0 |
| 2 | 1 |
+---+---+

이므로

$ mysql -e 'select a,b from tablefoo' databasename > file

file포함 하는 파일 을 생성합니다

a b
1 0
2 1

(여기서 탭은 각 줄의 영숫자 문자 사이에 있습니다).

리디렉션이 출력을 변경해서는 안된다고 생각합니다. 왜 두 개의 다른 결과를 얻습니까?


편집 : William Jackson답변에 따르면 이것이 mysql의 기능이라고합니다 : 출력 형식은 출력이 리디렉션되는지 여부에 따라 다릅니다. 그래도 이것은 내 질문에 대답하지 않습니다. mysql은 출력이 리디렉션되는지 여부를 어떻게 알 수 있습니까? 리디렉션은 출력을 가져 오는 것이 아니라 어딘가에 리디렉션합니까? mysql에 보이지 않아야합니까?


-tmysql 명령에 플래그를 추가하십시오 :)
spencer.sm

답변:


13

편집 : 이것이 어떻게되는지 확신 할 수는 mysql없지만 터미널 isatty(3)인지 여부를 결정 STDOUT하고 그에 따라 출력을 수정하는 데 사용할 수 있습니다 .

편집 2 :mysql 명령 줄 도구는 확실히 사용합니다 isatty(). 소스 코드를 읽을 수 있습니다.

C스택 오버플로 에서 이것에 대한 좋은 예가 있습니다 ()는 아닙니다 .


귀하의 질문에 대답하기 위해 "왜?": 문서에서 말하는 것이기 때문입니다. 참조 매뉴얼을 참조하십시오 .

대화식으로 사용하면 쿼리 결과가 ASCII 테이블 형식으로 표시됩니다. 비 대화식 (예 : 필터)으로 사용하면 결과는 탭으로 구분 된 형식으로 표시됩니다.

나는이 결정이 가독성에 대한 것이라고 생각한다. 대화식으로 사용될 때 mysql사람이 출력을 읽고 있다고 가정 할 수 있으며 일반적으로 사람이 해당 행으로 구분 된 데이터를 읽는 것이 더 쉽습니다. 비 대화식으로 사용될 때 다른 프로그램이 출력을 소비하고 탭으로 구분 된 출력이 프로그래밍 방식으로 소비하기 쉽다고 가정합니다.

출력을 경로 재 지정할 때이 기본값을 대체하고 ASCII 테이블 형식을 가져 오려면 --table( -t) 명령 행 옵션을 사용할 수 있습니다 .

mysql -t -e 'select a,b from tablefoo' databasename > file

1
기본값을 재정의하는 데 관심이 없습니다. ¶ 출력의 차이가 mysql에 있는지 또는 bash에 있는지 여부를 알지 못했습니다. 그러나 이것은 내 질문에 완전히 대답하지는 않습니다. mysql은 출력 결과를 어떻게 알 수 있습니까? 리디렉션이 mysql에 보이지 않아야한다고 생각합니다. 질문하려는 내용을보다 명확하게 설명하기 위해 질문을 편집했습니다. 그러나 +1, 아주 훌륭하게 대답하기 위해 나는 ( 아마도) 묻는 질문 처럼 보였습니다 .
msh210

아, 나는 오해했다. 내 답변을 업데이트했습니다.
William Jackson

아, 도움이됩니다. 그러나 그것은 여전히 ​​내가 정말로 원하는 것이 아닙니다. "isatty가 어떻게 '알고 있습니까?" 즉, isatty는 mysql에 의해 호출됩니다. stdout이 tty인지 여부는 mysql이 아닌 bash의 삶의 사실입니다. mysql은 bash에서 무슨 일이 일어나고 있는지 어떻게 알 수 있습니까? bash의 내용은 mysql에 보이지 않을 것이라고 생각합니다.
msh210

1
Stdout은 파일 디스크립터이며 다른 프로그램과 동일하게 bash사용 isatty()하여 디스크의 tty 또는 파일을 가리키는 지 판별 할 수 있습니다. isatty()bash가 아닌 OS에서 제공합니다.
윌리엄 잭슨
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.