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 "$( "${pr...@]}" )" That example or a similar one would be nice in the FAQ. Thanks anyhow for the clarification and your patience with me. Regards -- hgb