Fri, 03 Jan 2014
Take this job…
I/O Redirection
Linux shells (and Unix shells before them) have three popular methods for passing data around: STDIN
(standard input), STDOUT
(standard output), and STDERR
(standard error). To keep things simple, think of STDIN
as your keyboard, STDOUT
as your screen, and STDERR
as, uh, your screen when something breaks. As you will see later, there are nuances — STDIN
isn’t always the keyboard, nor are STDOUT
and STDERR
always your screen.
Let’s start with a simple reason for knowing what STDIN
, STDOUT
, and STDERR
do. For example, sometimes I want the output of a command to go somewhere besides the screen right in front of me. Instead, I may want the output to go to a new file, fileout.txt
, so I can read it later.
To do this, I would redirect the output from my command, like so:
ls foo > fileout.txt
That “>
” means “take standard out from the previous command (ls foo
) and redirect it to the named file (fileout.txt); if the file already exists, overwrite it with whatever output I give you”. It’s what’s called an I/O redirection operator. Other such operators are <
(take the following file and give its contents to the preceding command) and >>
(append the output of the previous operation to the following file; if the file doesn’t already exist, create it).
STDIN
, STDOUT
, and STDERR
have numbers, too. STDIN
is 0
, STDOUT
is 1
, and STDERR
is 2
. When using I/O redirection operators without an identifying number, the shell presumes that you want to reference STDOUT
. However, you can always choose to explicitly use the numbers. Let’s say I want STDERR
to be redirected to a file:
ls foo 2> fileerr.txt
After running the command, fileerr.txt would contain text like this:
ls: cannot access foo: No such file or directory
Presuming, of course, that a file named “foo” does not exist in the current directory.
Naturally, there are ways to combine redirection operators to make scripting output less verbose and avoid having your system administrator contact you about your abuse of the system.
Join us next time for another exciting episode!
posted at: 09:43 | permanent link to this entry Take this job…
I/O Redirection
As previously discussed, sometimes I want the output of a command to go somewhere besides the screen right in front of me.
For example, I have a script running from cron
— which has no screen to which it should send its output. On many Linux and Unix systems, it will instead generate an email, which is generally sent to the system administrator. She probably doesn’t want to see the output of my script, however. Especially if there are 50 users on the system, all of whom are sending script output to email. And we certainly don’t want the output to go to the great bit bucket in the sky… At least not until we learn about /dev/null
.
Instead, I want both <STDOUT> and <STDERR>
to go to a file. Earlier, I showed you how to send either <STDOUT> or <STDERR>
to a file. However, I can also combine these into a single I/O redirect, like so:
ls 2>&1> foo
This has taken the <STDERR>
and redirected it to the same file descriptor as <STDOUT>
, which is then dumped to a file. This is rather complicated to type, so more recent versions of some shells provide a shorter method:
ls &> foo
But what if I want my <STDOUT> and <STDERR>
to go to two different files? Stay tuned…
Marc Elliot Hall St. Peters, Missouri
Page created: 21 January 2002
Page modified: 09 December 2017