[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Commands executed with $($prog) do not run properly
From: |
Hans-Georg Bork |
Subject: |
Re: Commands executed with $($prog) do not run properly |
Date: |
Mon, 08 Nov 2010 16:51:00 +0100 |
Hi,
On Mon, 2010-11-08 at 09:49 -0500, Greg Wooledge wrote:
> On Mon, Nov 08, 2010 at 03:26:10PM +0100, Hans-Georg Bork wrote:
> > if this is true, then please explain the differences between
> > $ find /test -type d ! -wholename "/test"
> > (/test not shown)
> > and
> > $ prog='find /test -type d ! -wholename "/test"'
> > $ echo $prog
> > find /test -type d ! -wholename "/test"
> > $ echo "$($prog)"
> > (/test shown)
> > (more results in original mail)
>
> imadev:~$ args find /test -type d ! -wholename "/test"
> 7 args: <find> </test> <-type> <d> <!> <-wholename> </test>
> imadev:~$ prog='find /test -type d ! -wholename "/test"'
> imadev:~$ args $prog
> 7 args: <find> </test> <-type> <d> <!> <-wholename> <"/test">
this makes the whole thing now clear to me. I weren't aware that find
doesn't strip the quotes on itself, but takes them as part of the
pattern.
>
> "args" is a script that I have in ~/bin. Here is it:
>
> imadev:~$ cat bin/args
> #! /bin/sh
> printf "%d args:" $#
> printf " <%s>" "$@"
> echo
>
> I find it incredibly useful.
I do as well now. I copied it. Thanks for that.
> [...]
> GNU man page, I assume? The one in Debian 5.0 has this example:
>
> -path pattern
> File name matches shell pattern pattern. The metacharacters do
> not treat `/' or `.' specially; so, for example,
> find . -path "./sr*sc"
>
> This example is fine, and it demonstrates the use of quotes to protect
> a glob from exapansion BY A SHELL. But then the shell removes the
> quotes before passing the glob on to find. find should never see the
> actual quotes. If it does, it will treat them as literal. That is not
> what you want.
There was my misunderstanding. Thanks again for pointing me to that.
>
> In your code, you were passing literal quotes to find along with the
> directory name. This is why it failed.
>
> The workarounds if you absolutely positively MUST put the argument vector
> into a variable are (1) eval, or (2) an array. And I'd avoid eval if I
> were writing the script. It's extremely dangerous, especially if your
> arguments are as complex as you say.
>
> Since you appear not to have read http://mywiki.wooledge.org/BashFAQ/050
> yet, let me do all the hard reading for you.
I read it; it just has a lot about arguments. I didn't realize that I
should translate it to commands as well.
> This is what you SHOULD have used:
>
> prog=(find /test -type d ! -wholename "/test")
> echo "$( "${prog[@]}" )"
That example or a similar one would be nice in the FAQ. Thanks anyhow
for the clarification and your patience with me.
Regards
-- hgb