- Use the greater-than symbol to append text to a file:
$ echo "This is a sample text 1" > temp.txt
This stores the echoed text in temp.txt. If temp.txt already exists, the single greater-than sign will delete any previous contents.
- Use double-greater-than to append text to a file:
$ echo "This is sample text 2" >> temp.txt
- Use cat to view the contents of the file:
$ cat temp.txt
This is sample text 1
This is sample text 2
The next recipes demonstrate redirecting stderr. A message is printed to the stderr stream when a command generates an error message. Consider the following example:
$ ls +
ls: cannot access +: No such file or directory
Here + is an invalid argument and hence an error is returned.
Successful and unsuccessful commands
When a command exits because of an error, it returns a nonzero exit status. The command returns zero when it terminates after successful completion. The return status is available in the special variable $? (run echo $? immediately after the command execution statement to print the exit status).
The following command prints the stderr text to the screen rather than to a file (and because there is no stdout output, out.txt will be empty):
$ ls + > out.txt
ls: cannot access +: No such file or directory
In the following command, we redirect stderr to out.txt with 2> (two greater-than):
$ ls + 2> out.txt # works
You can redirect stderr to one file and stdout to another file.
$ cmd 2>stderr.txt 1>stdout.txt
It is also possible to redirect stderr and stdout to a single file by converting stderr to stdout using this preferred method:
$ cmd 2>&1 allOutput.txt
This can be done even using an alternate approach:
$ cmd &> output.txt
If you don't want to see or save any error messages, you can redirect the stderr output to /dev/null, which removes it completely. For example, consider that we have three files a1, a2, and a3. However, a1 does not have the read-write-execute permission for the user. To print the contents of all files starting with the letter a, we use the cat command. Set up the test files as follows:
$ echo A1 > a1
$ echo A2 > a2
$ echo A3 > a3
$ chmod 000 a1 #Deny all permissions
Displaying the contents of the files using wildcards (a*), will generate an error message for the a1 file because that file does not have the proper read permission:
$ cat a*
cat: a1: Permission denied
A2
A3
Here, cat: a1: Permission denied belongs to the stderr data. We can redirect the stderr data into a file, while sending stdout to the terminal.
$ cat a* 2> err.txt #stderr is redirected to err.txt
A2
A3
$ cat err.txt
cat: a1: Permission denied
Some commands generate output that we want to process and also save for future reference or other processing. The stdout stream is a single stream that we can redirect to a file or pipe to another program. You might think there is no way for us to have our cake and eat it too.
However, there is a way to redirect data to a file, while providing a copy of redirected data as stdin to the next command in a pipe. The tee command reads from stdin and redirects the input data to stdout and one or more files.
command | tee FILE1 FILE2 | otherCommand
In the following code, the stdin data is received by the tee command. It writes a copy of stdout to the out.txt file and sends another copy as stdin for the next command. The cat -n command puts a line number for each line received from stdin and writes it into stdout:
$ cat a* | tee out.txt | cat -n
cat: a1: Permission denied
1 A2
2 A3
Use cat to examine the contents of out.txt:
$ cat out.txt
A2
A3
Observe that cat: a1: Permission denied does not appear, because it was sent to stderr. The tee command reads only from stdin.
By default, the tee command overwrites the file. Including the -a option will force it to append the new data.
$ cat a* | tee -a out.txt | cat -n
Commands with arguments follow the format: command FILE1 FILE2 ... or simply command FILE.
To send two copies of the input to stdout, use - for the filename argument:
$ cmd1 | cmd2 | cmd -
Consider this example:
$ echo who is this | tee -
who is this
who is this
Alternately, we can use /dev/stdin as the output filename to use stdin.
Similarly, use /dev/stderr for standard error and /dev/stdout for standard output. These are special device files that correspond to stdin, stderr, and stdout.