Ubuntu – how to get output of a script/program into a file


I am compiling a program using make and want the output of make to be written to a file. I have tried using > operator like

make > build_log.txt

and using tee command like

make | tee build_log.txt

but the problem is that some of the ouput goes into the file but rest keeps appearing on the screen.

I can simply copy/paste the text from terminal into a file after running make but that is not a solution.

So my question is how do I save i.e redirect all the output to file so that it goes into file only without appearing on screen.

Best Answer

The text that is displayed in the terminal comes from the stderr stream (2). If you do just make > build_log.txt, only the stdout (1) stream is redirected to the build_log.txt file.

  • stdout is the standard output stream and has file descriptor number 1. This is the default stream being redirected in shells.
  • stderr is the standard error stream and has file descriptor number 2

To redirect the stderr stream to that build_log.txt file too, use:

make > build_log.txt 2>&1
  • make is executed and
    • the stdout stream is redirected (>) to build_log.txt
    • the stderr stream is redirected (2>) to the stdout stream (&1), which was redirected to build_log.txt

The order is important, you cannot switch switch the redirection operators like make 2>&1 > build_log.txt.

Alternative command:

make 2>&1 | tee build_log.txt > /dev/null

The redirection to /dev/null is needed to hide output, tee writes its input to build_log.txt and outputs it too.