2010-01-27 4 views
5

나는과 같이, 프로그램을 실행하고 OUTFILE에 cout 리디렉션 해요 :cout을 outfile로 재지향하면서 터미널로 보낼 수 있습니까?

./program <infile.in> outfile.o 

내가 옵션에서 읽을 수있게하려는 명령 ('-h'나 '--help') 터미널에 도움말 메시지를 출력하십시오. 내가 할 수있는 방법이 있지만 여전히 프로그램의 나머지 부분에서 일반 cout outfile로 이동합니까?

cout 그런 것에 사용할 올바른 개체가 되겠습니까?

답변

15

당신은 출력으로 재 지정에 포함되지 STDERR에 당신의 도움이 메시지를 cerr을 사용한다 outfile.o.

을 감안할 때 ./program <infile.in> outfile.o :

cout << "This writes to STDOUT, and gets redirected to outfile."; 
cerr << "This doesn't get redirected, and displays on screen."; 

, 나중에, 당신은 모두 STDOUT 및 STDERR을 리디렉션 할 경우, 당신은 STDOUT에 당신은 STDERR를 재 지정하려면

./program < infile.in &> outfile.o 

을하지만, 할 수 있습니다 디스플레이, 사용

./program < infile.in 2> outfile.o 

Bash redirection은 대부분의 것보다 더 복잡합니다. 사람들은 깨닫고, 가장 단순한 형태 (">")를 제외한 모든 것을 간과하게됩니다.

+0

도움 주셔서 감사합니다. – zebraman

0

cout 대신 cerr을 사용해야합니다. 셸 리디렉션 사용>은 stderr (cerr)이 아닌 stdout (cout) 만 리디렉션합니다.

1

stderr에 도움말 메시지를 출력하고자 할 수 있습니다. Stderr는 일반적으로 비정상적인 출력에 사용되며 사용법 단락을 그러한 출력으로 간주 할 수 있습니다.

2

~$ cmd | tee log_file 파일에 터미널 위에 stdoutstderr를 인쇄 할 터미널을
~$ cmd 2>log_file을 제기 stdout를 DUP하는

1

내가 한 일 중 하나는 항상 적절하다고 말하는 것이 아니라이 서명과 같은 모듈을 작성하는 것입니다.

void write_out(ostream &o); 

그리고 나는 fstream 객체를 생성하고 그들에 합격하거나, 내가 그 시간에 필요 어떤 COUT과 cerr에 전달할 수 있습니다. 이것은 로깅 코드 작성에 도움이 될 수 있습니다. 때로는 터미널에서 터미널이 어떻게되는지보고 싶을 때도 있고, 다른 경우에는 로그 파일을 원할 때도 있습니다.

HTH.

3

리눅스에 있다면 의사 장치 /dev/tty을 사용하여 제어 터미널 (있는 경우)로 출력 할 수 있습니다. stderr이 리디렉션되고 stdout 인 경우에도 작동합니다. 다른 운영 체제에서도 유사한 메커니즘을 제공 할 수 있습니다.

예.

#include <iostream> 
#include <ostream> 
#include <fstream> 

int main() 
{ 
     std::ofstream term("/dev/tty", std::ios_base::out); 

     term << "This goes to terminal\n"; 
     std::cout << "This goes to stdout\n"; 

     return 0; 
} 

이렇게 일 것이다

 
$ ./a.out 
This goes to stdout 
This goes to terminal 
$ ./a.out >/dev/null 
This goes to terminal 

참고 그들이 반드시 유지되지 동일한 장치에 출력하는 경우에는 두 스트림과는 독립적으로 상대적인 순서를 버퍼링되어있는 방법. 적절한 시간에 스트림을 플러시하여 조정할 수 있습니다.

관련 문제