When a command is started under Linux it has three data streams associated with it: standard input (stdin), standard output (stdout), and standard error (stderr). The corresponding file numbers are 0, 1 and 2. Initially all these data streams are connected to the terminal.
A terminal is also a type of file in Linux. Most of the commands take input from the terminal and produce output on the terminal. In most cases we can replace the terminal with a file for either or both of input and output. For example:
ls > listfile
puts the listing of files in the current directory in the file listfile. The symbol > means redirect the standard output to the following file, rather than sending to the terminal.
The symbol » operates just as >, but appends the output to the contents of the file listfile instead of creating a new file. Similarly, the symbol < means to take the standard input for a program from the following file, instead of from a terminal. For example:
mutt -s "program status report" mary joe tom < letter
mails the contents of the file letter to the three users: mary, joe and tom. The command mail can also be used in place of the mutt mailer in the above example without any change.
To redirect error messages (which are sent on stderr with file descriptor 2) see the following example.
gcc BadProgram.c 2> error.log
Or if you want both the output and the error messages to go to a file, see the following example.
gcc BadProgram.c > log 2>&1