[clug] Next in my series of "how to do things in /bin/sh that you probably shouldn't".

Andrew Janke a.janke at gmail.com
Wed Aug 19 20:44:42 MDT 2009

> There's another way, but it's "cheating" and will cost you an extra
> process.

As it turns out what you are suggesting is like what others (who
emailed privately) suggested regarding using a wrapper script for all
such scripts that you would like to do this with.

> And you have to pick an environment variable that won't
> clash (unless you want to muck around using eval to set an envvar
> based on $$ (in the parent) and $PPID (in the child)).

erky!  Surely the name of the script plus a bit of glook would work in
99.9% of cases.

>    #!/bin/bash
>    if [ "x$redir" = "x" ]; then
>        redir=y "$0" "$@" 2>&1 | tee ${0##*/}.log
>        exit $?
>    else
>        unset redir
>    fi

Nice! Still I am not entirely sure why you need the else as "$redir"
should be local to the call inside the if? Or am I missing something?

#! /bin/sh

if [ "x$redir" = "x" ]; then
   redir=y "$0" "$@" 2>&1 | tee fred.log
   exit $?

echo "Fred - $@ - $*"

Works just as well with the added bonus that it can be done in /bin/sh
should you try to run this on OSX and get caught with the sh/bash/ash
default weirdness.


Andrew Janke
(a.janke at gmail.com || http://a.janke.googlepages.com/)
Canberra->Australia    +61 (402) 700 883

More information about the linux mailing list