====== BASH - Redirection ====== In Linux/Unix, everything is a file. Regular file, Directories, and even Devices are files. Every File has an associated number called File Descriptor (FD). * Your screen has a File Descriptor. When a program is executed the output is sent to File Descriptor of the screen, and you see program output on your monitor. * Your printer has a File Descriptor. If the output is sent to File Descriptor of the printer, the program output would be printed. ---- ===== Standard File Descriptors ===== Whenever you execute a program/command at the terminal, 3 files are always open, viz., standard input, standard output, standard error. These files are always present whenever a program is run. ^File^File Descriptor^ |Standard Input STDIN|0| |Standard Output STDOUT|1| |Standard Error STDERR|2| The keyboard is the standard input device while your screen is the standard output device. However, files can have their input and output redirected, using: * ">" is the output redirection operator. * ">>" appends output to an existing file * "<" is the input redirection operator * ">&" re-directs output of one file to another. * Errors can be re-directed using its corresponding File Descriptor 2. ---- ===== Output Redirection ===== The '>' symbol is used for output (STDOUT) redirection. ls -al > listings Here the output of command ls -al is re-directed to file "listings" instead of your screen. **NOTE:** Use the correct file name while redirecting command output to a file. If there is an existing file with the same name, the redirected command will delete the contents of that file and then it may be overwritten. If you do not want a file to be overwritten but want to add more content to an existing file, then you should use '>>' operator. ---- ===== Redirect standard output to devices ===== You can redirect standard output, to not just files, but also devices! cat music.mp3 > /dev/audio The **cat** command reads the file music.mp3 and sends the output to /dev/audio which is the audio device. If the sound configurations in your PC are correct, this command will play the file music.mp3. ---- ===== Input redirection ===== The '<' symbol is used for input (STDIN) redirection. Mail -s "Subject" to-address < Filename This would attach the file with the email, and it would be sent to the recipient. ---- ===== Error Redirection ===== Error re-direction is one of the very popular features of Unix/Linux. Frequent UNIX users will reckon that many commands give you massive amounts of errors. * For instance, while searching for files, one typically gets permission denied errors. These errors usually do not help the person searching for a particular file. * While executing shell scripts, you often do NOT want error messages cluttering up the normal program output. The solution is to re-direct the error messages to a file. ==== Example 1 ==== myprogram 2>errorsfile Executes a program names myprogram. The file descriptor for standard error is 2. Using "2>" we re-direct the error output to a file named "errorfile" Thus, program output is not cluttered with errors. ---- ==== Example 2 ==== find . -name 'my*' 2>error.log Using the "find" command, we are searching the "." current directory for a file with "name" starting with "my". ---- === Example 3 === A more complex example, Server Administrators frequently, list directories and store both error and standard output into a file, which can be processed later. ls Documents ABC> dirlist 2>&1 Here, * which writes the output from one file to the input of another file. 2>&1 means that STDERR redirects to the target of STDOUT (which is the file dirlist) * We are redirecting error output to standard output which in turn is being re-directed to file dirlist. Hence, both the output is written to file dirlist