Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: greps pipes and eval bad patterns

On 10/25/2015 06:02 PM, Bart Schaefer wrote:
On Oct 25, 12:47pm, Ray Andrews wrote:
} test1 ()
} {
}      gstring=" | grep \[01;34m "
}      tree --du -haC | grep -Ev "^[^\[]{$levels}\[*" "$gstring"
} }

One doesn't normally build up a pipeline that way, but if you must

What would be the better way? I'm not wedded to anything, just looking for the
appropriate method.
so, you're on the right track with "eval" -- you just haven't applied
enough quoting.  "eval" is going to re-parse everything, so you need
to quote everyhing to the same depth:

     eval 'tree --du -haC | grep -Ev "^[^\[]{$levels}\[*"' "$gstring"

The single quotes (before tree and after the levels pattern) keep the
first pipeline (and importantly the double-quotes that are around the
grep pattern) from being interpreted until eval does so.

Enlightenment. We freeze all expansions with single quotes until eval sorts it all out in
one go.

The use of
the parameter for $gstring has the same effect.

You might be able to see this better if you assign everything to
variables before eval-ing, e.g.

   test1 ()
      gstring="| grep \[01;34m "
      glevels='| grep -Ev "^[^\[]{$levels}\[*"'
      tree="tree --du -haC"
      eval "$tree" $glevels" "$gstring"

Yeah, that's the sort of thing I'm used to doing I just didn't know how to handle the tricky characters. It makes nothing but sense now that I see it. So the final product

t ()
    local gstring=
    [ "$1" = ',f' ] && { gstring=' | grep "\[01;34m" '; shift }
    integer levels=$(( ($1 + 1) * 4 ))
    eval ' tree --du -haC | grep -Ev "^[^\[]{$levels}\[*" ' $gstring
    du -sh .

... a better tree than tree.

Messages sorted by: Reverse Date, Date, Thread, Author