tar to pipe but keep -v verbose output separate from STDERR

If your system supports /dev/fd/n:

tar cvf /dev/fd/3 ./foo 3>&1 > foo.out 2>foo.err | squish > foo.tar.S

Which with AT&T implementations of ksh (or bash or zsh) you could write using process substitution:

tar cvf >(squish > foo.tar.S) ./foo > foo.out 2>foo.err

That's doing exactly the same thing except that this time, the shell decides of which file descriptor to use instead of 3 (typically above 9). Another difference is that this time, you get the exit status of tar instead of squish. On systems that do not support /dev/fd/n, some shells may resort to named pipes for that feature.

If your system doesn't support /dev/fd/n or your shell can't make use of named pipes for its process substitution, that's where you'd have to deal with named pipes by hand.

You have to use a named pipe for that.

First create one in the folder:

mkfifo foo.pipe

Then use that command:

tar cvf foo.pipe ./foo >foo.out 2>foo.err & cat foo.pipe >foo.tar

Notice: the cat-part, can now also be gzip or whatever, that can read from a pipe:

tar cvf foo.pipe ./foo >foo.out 2>foo.err & gzip -c foo.pipe >foo.tar


The output is written to the name pipe (foo.pipe), where another proccess (cat, gzip, netcat) reads from. So you don't loose the stdout/stderr channels for information.

GNU tar's --index-file option works well:

tar cvf - ./foo 2>foo.err --index-file=foo.out | squish > foo.tar.S