I/O Redirection
On UNIX the streams for getting input and writing output are predefined. There are always three default files open:
stdinis the input data source (the keyboard)stdoutis the output data source (the screen)stderris the standard error output source (error messages output to the screen)
These, and any other open files, can be redirected. Redirection simply means capturing output from a file, command, program, script, or even code block within a script and sending it as input to another file, command, program, or script.
## command_output >
# Redirect stdout to a file
# Creates the file if not present, otherwise overwrites it.
$ ls -la > ls_result.txt
## : > filename
# The '>' truncates file 'filename; to zero length
# If file not present, creates zero-length file (same effect as 'touch')
# The ':' serves as a dummy placeholder, producing no output
$ : > empty_file.txt
## command_output >>
# Redirect stdout to a file
# Creates the file if not present, otherwise appends to it
$ ls -la >> ls_result.txtEach open file gets assigned a file descriptor. The file descriptors for stdin, stdout, and stderr are 0, 1, and 2, respectively. For opening additional files, there remain descriptors 3 to 9.
## m>n
# 'm' is a file descriptor, which defaults to 1, if not explicitly set
# 'n' is a filename
# File descriptor 'm' is redirect to file 'n'
$ ls -la > ls_result.txt
$ ls -la 1>ls_result.txt
$ ./script.sh 2>error.log
## m>&n
# 'm' is a file descriptor, which defaults to 1, if not set
# 'n' is another file descriptor
$ ./script.sh 2>&1 > log.txt
## &>filename
# Redirect both stdout and stderr to file 'filename'
$ ./script.sh &>filename
## < filename
# Accept input from a file
$ grep "*some*" <filename
$ grep "*some*" 0<filenameYou can ensure none of your redirects clobber an existing file by setting the noclobber option in the shell:
$ set -o noclobber
$ sort file.txt > file.txt
-bash: file.txt: cannot overwrite existing fileReferences
Last updated