Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: greps pipes and eval bad patterns
- X-seq: zsh-users 20821
- From: Kurtis Rader <krader@xxxxxxxxxxxxx>
- To: Zsh Users <zsh-users@xxxxxxx>
- Subject: Re: greps pipes and eval bad patterns
- Date: Sun, 25 Oct 2015 18:17:46 -0700
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=skepticism_us.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type; bh=W0VeNbyh6x+W823OUEqkgPNVPjs4N2J5ZXO+RD8M7uA=; b=FTHgDFr5RqgbNEr6HcHYLWMz7s6iUP8XL2et3rXfy1+kHtFePfDKFX4MuA81scmhfA hV0fbIFfRrxIY9Tmx2GhuAcR486rAHOr8eowQgXwCVXuTQzFf12pdrWb+hJDzUobxN8o cVNY2ujTGAULTqSOiHcbFsm8qord8wz3x7fFvpsMQw2+xk9SIxwnoPVw/1Z59Rn1JZoT 62hSYQHBgGfYnY6TcEtLW3aolEKvKTUDbITC62G1awbqrF7CCj73U226e4wN99CXA0A+ IGCmaxnbFyH6EH0pdTa9ftha4P7Ap5ooL0R9B3NAN4blCcnWwzytN448Wz3xX8uedcDR 895w==
- In-reply-to: <151025180235.ZM30558@torch.brasslantern.com>
- List-help: <mailto:zsh-users-help@zsh.org>
- List-id: Zsh Users List <zsh-users.zsh.org>
- List-post: <mailto:zsh-users@zsh.org>
- Mailing-list: contact zsh-users-help@xxxxxxx; run by ezmlm
- References: <562D31C3.9030705@eastlink.ca> <151025180235.ZM30558@torch.brasslantern.com>
On Sun, Oct 25, 2015 at 6:02 PM, Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx>
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 do
> so, you're on the right track with "eval" -- you just haven't applied
> enough quoting....
In addition to what Bart said I'll point out that it's usually easier and
safer to avoid the eval by using an if/else block. Getting the quoting
right when using eval can be very difficult. Especially if you don't have
direct control over the text being eval'd; e.g., if some of it is supplied
by the user; or even just built up from earlier parts of the function.
I have several functions where 99% of the time I want the output
automatically piped into my pager (e.g., /usr/bin/less). But if the output
of the function is redirected away from my tty I don't want the pager in
the pipeline. So instead of using a variable that would normally contain "|
$PAGER" and sometimes be empty (i.e., using Ray's approach) I simply spell
it out:
if [[ -t 1 ]] ; then
grep -h -E $case_insensitive -- "$search_for" $files | $PAGER
else
grep -h -E $case_insensitive -- "$search_for" $files
fi
Yes, that introduces some redundancy. But it's far clearer and safer than
writing something like this (totally untested):
if [[ -t 1 ]] ; then
pager='| $PAGER'
else
pager=''
fi
eval grep -h -E $case_insensitive -- "$search_for" $files $pager
--
Kurtis Rader
Caretaker of the exceptional canines Junior and Hank
Messages sorted by:
Reverse Date,
Date,
Thread,
Author