2010-01-27 4 views

Odpowiedz

15

Należy użyć cerr do wyjścia swój komunikat pomocy na stderr, który nie jest ujęty w swoim przekierowania to outfile.o.

Biorąc ./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."; 

Jeżeli później, chcesz przekierować zarówno STDOUT i stderr, można zrobić

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

Jeśli chcesz przekierować tylko STDERR, ale pozwalają STDOUT do wyświetlanie, użycie

Bash redirection jest bardziej skomplikowany niż większość ludzie zdają sobie sprawę, i często wszystko oprócz najprostszej formy (">") zostaje przeoczone.

+0

niesamowite, dzięki za pomoc! – zebraman

0

Powinieneś używać cerr zamiast cout. Korzystanie z przekierowania powłoki tylko przekierowuje standardowe wyjście (cout), a nie stderr (cerr).

1

Możesz chcieć wypisać komunikat pomocy na stderr. Stderr jest zwykle używany do wyjścia innego niż normalne i możesz uważać akapit użycia za taki wynik.

2

~$ cmd | tee log_file dup stdout złożyć i terminalu
~$ cmd 2>log_file wydrukować stdout na terminalu i stderr do pliku

1

Jedną z rzeczy, które zrobiłem - nie mówiąc to zawsze jest właściwe - są moduły zapisu, które mają coś podobnego do tego podpisu.

void write_out(ostream &o); 

A potem mogę tworzyć obiekty fstream i przekazać je lub przekazać w cout i cerr, co muszę w tym czasie. Może to być pomocne przy pisaniu kodu logowania, gdzie czasami chcesz zobaczyć na terminalu, co się dzieje, a innym razem po prostu potrzebujesz pliku logu.

HTH.

3

Jeśli używasz systemu Linux, możesz użyć pseudo urządzenia /dev/tty do wyprowadzenia na terminal sterujący (jeśli taki jest). To zadziała, nawet jeśli zostanie przekierowane stderr, a także stdout. Inne systemy operacyjne mogą zapewniać podobne mechanizmy.

E.g.

#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; 
} 

będzie działać tak:

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

zanotować sposób, że z dwóch strumieni jest buforowany niezależnie względną kolejność wyprowadzania jeśli są one do tego samego urządzenia niekoniecznie jest zachowana. Można to skorygować, przepłukując strumienie w odpowiednich momentach.

Powiązane problemy