One reason you have a mysterious Unix file called 2 (or 1)

June 17, 2017

Suppose, one day, that you look at the ls of some directory and you notice that you have an odd file called '2' (just the digit). If you look at the contents of this file, it probably has nothing that's particularly odd looking; in fact, it likely looks like plausible output from a command you might have run.

Congratulations, you've almost certainly fallen victim to a simple typo, one that's easy to make in interactive shell usage and in Bourne shell scripts. Here it is:

echo hi  >&2
echo oop >2

The equivalent typo to create a file called 1 is very similar:

might-err 2>&1 | less
might-oop 2>1  | less

(The 1 files created this way are often empty, although not always, since many commands rarely produce anything on standard error.)

In each case, accidentally omitting the '&' in the redirection converts it from redirecting one file descriptor to another (for instance, forcing echo to report something to standard error) into a plain redirect-to-file redirection where the name of the file is your target file descriptor number.

Some of the time you'll notice the problem right away because you don't get output that you expect, but in other cases you may not notice for some time (or ever notice, if this was an interactive command and you just moved on after looking at the output as it was). Probably the easiest version of this typo to miss is in error messages in shell scripts:

if [ ! -f "$SOMETHING" ]; then
  echo "$0: missing file $SOMETHING" 1>2
  echo "$0: aborting" 1>&2
  exit 1
fi

You may never run the script in a way that triggers this error condition, and even if you do you may not realize (or remember) that you're supposed to get two error messages, not just the 'aborting' one.

(After we stumbled over such a file recently, I grep'd all of my scripts for '>2' and '>1'. I was relieved not to find any.)

(For more fun with redirection in the Bourne shell, see also how to pipe just standard error.)


Comments on this page:

By -dsr- at 2017-06-18 15:36:38:

No, no, I never make that mistake.

But I also occasionally have mysterious files named '1'.

ESC:wq1 is to blame.

By Anon at 2017-06-18 18:36:41:

Bash has that whacky syntactic shorthand &> for doing both at once (https://stackoverflow.com/a/16283739/7836056 )...

By Dan (Dan.Astoorian) at 2017-06-19 10:10:01:

In my case, the usual culprit is using Bourne-syntax redirection (e.g. 2>&1) in a csh-syntax shell.

Written on 17 June 2017.
« Go interfaces and automatically generated functions
How I'm currently handling the mailing lists I read »

Page tools: View Source, View Normal, Add Comment.
Search:
Login: Password:
Atom Syndication: Recent Comments.

Last modified: Sat Jun 17 23:58:57 2017
This dinky wiki is brought to you by the Insane Hackers Guild, Python sub-branch.