[clug] capturing stdout of shell function without subprocess or tempfile

Kevin Pulo kev at pulo.com.au
Wed Aug 19 23:28:02 MDT 2009


All this scripting fun reminded me of a problem I had recently and
couldn't solve.

It's easy (in bash) to feed the contents of a variable to a program
without using an extra process by using a here-string:

    somecommand <<< "$foobar"

In the bad old days that had to be a full here-document:

    somecommand <<-EOF
    $foobar
    EOF

or worse, something stupid like:

    echo "$foobar" | somecommand

or else you had to use a temporary file:

    echo "$foobar" > tmpfile
    somecommand < tmpfile

Tempfiles are a pain, because then you have to set up traps to get rid
of them (which still don't help for SIGKILL), where to put them,
unique names, races, they assume a read-write filesystem, they're
slower than being in-memory, etc etc.

I want the reverse.  I want to grab the output of a shell function,
and stick it in a variable.  But, the catch is, I don't want to use
tempfiles, and I don't want the shell function running in a subprocess
(because the function has side-effects, ie. it sets important
variables).

So things like:

    foobar="$(somefunction)"
    somefunction | read foobar
    read foobar < <(somefunction)

and so on are no good.

Is it just me, or is this impossible?  Does bash need something like
an inverse here-string added to it to be able to do this, eg:

    somefunction >>> foobar

??

To put it another way, if I have something like this:

    #!/bin/bash
    
    function func {
        foo=$(($foo + 1))
        echo 2
    }
    
    foo=1
    
    tmpfile="${TMP:-/tmp}/${0##*/}-$$"
    func > "$tmpfile"
    read bar < "$tmpfile"
    rm -f "$tmpfile"
    
    # each no good:
    #bar=$(func)
    #read bar < <(func)
    #func | read bar
    
    bar=$(($bar + 1))
    
    echo "$foo $bar"

I want to get rid of the tmpfile use and still have it output
correctly (ie. "2 3").  Wishful thinking?

Kev.

-- 
.----------------------------------------------------------------------.
| Kevin Pulo                Quidquid latine dictum sit, altum viditur. |
| kev at pulo.com.au               _ll l_ng__g_e_ _r_ hi__ly p__d_ct__le. |
| http://www.kev.pulo.com.au/         God casts the die, not the dice. |
`--------------- Linux: The choice of a GNU generation. ---------------'
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: <http://lists.samba.org/pipermail/linux/attachments/20090820/8fb322db/attachment.pgp>


More information about the linux mailing list