Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

I saw this line in a script:

DEVICE=`dialog --inputbox "Festplatten-Laufzeit auslesen. Gebe Sie das 
gewünschte Device an: " 0 70 "" 3>&1 1>&2 2>&3`

What is

3>&1 1>&2 2>&3

doing? I know that 1 = stdout and 2 = stderr, but what are the 3 and the & for?

share|improve this question
add comment

2 Answers

The numbers are file descriptors and only the first three (starting with zero) have a standardized meaning:

0 - stdin
1 - stdout
2 - stderr

So each of these numbers in your command refer to a file descriptor. You can either redirect a file descriptor to a file with > or redirect it to another file descriptor with >&

The 3>&1 in your command line will create a new file descriptor and redirect it to 1 which is STDOUT. Now 1>&2 will redirect the file descriptor 1 to STDERR and 2>&3 will redirect file descriptor 2 to 3 which is STDOUT.

So basically you switched STDOUT and STDERR, these are the steps:

  1. Create a new fd 3 and point it to the fd 1
  2. Redirect file descriptor 1 to file descriptor 2. If we wouldn't have saved the file descriptor in 3 we would loose the target.
  3. Redirect file descriptor 2 to file descriptor 3. Now file descriptors one and two are switched.

If the program now prints something to the file descriptor 1 it will be printed to the file descriptor 2 et vice versa.

share|improve this answer
add comment

It's swapping stdout and stderr.

>name means redirect output to file name.

>&number means redirect output to file descriptor number.

So the & is needed to tell the shell you mean a file descriptor, not a file name.

A file descriptor is a number that refers to an already open file. The standard ones are 0 for standard input, 1 for standard output or 2 for standard error. You can also use any other number, which will create a new file descriptor, just like when you create a new variable with var=value.

By default, both file descriptor 1 and 2 go to /dev/tty, so if you run somecommand 3>&1 1>&2 2>&3 in a new shell, it doesn't change anything (except now you have a file descriptor number 3).

But if somewhere earlier in the script it does a redirection using exec (e.g. exec 2>error.log), or the script is run with a command line including redirection (e.g. ./thescript 2>error.log), then swapping stdout and stderr will do something.

In your specific case, the command that's having its stdout and stderr swapped is dialog. Looking at its man page, I see

Some widgets, e.g., checklist, will write text to dialog's output.
Normally that is the standard error

so perhaps the person who wrote the script wants dialog's output to go to stdout instead of stderr for some reason.

See also Order of redirections

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.