Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: Printing arrays for use with $()
- X-seq: zsh-users 9303
- From: DervishD <zsh@xxxxxxxxxxxx>
- To: Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx>
- Subject: Re: Printing arrays for use with $()
- Date: Fri, 12 Aug 2005 10:29:09 +0200
- Cc: Zsh Users <zsh-users@xxxxxxxxxx>
- In-reply-to: <1050812022700.ZM12607@xxxxxxxxxxxxxxxxxxxxxxx>
- Mail-followup-to: Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx>, Zsh Users <zsh-users@xxxxxxxxxx>
- Mailing-list: contact zsh-users-help@xxxxxxxxxx; run by ezmlm
- Organization: DervishD
- References: <20050811161654.GA8200@DervishD> <1050811163714.ZM2498@xxxxxxxxxxxxxxxxxxxxxxx> <20050811170124.GA8279@DervishD> <20050811222847.GA341@DervishD> <1050812022700.ZM12607@xxxxxxxxxxxxxxxxxxxxxxx>
Hi Bart :)
* Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx> dixit:
> On Aug 11, 7:01pm, DervishD wrote:
> } So, if I must pass a list of filenames from one app to another in
> } the most generic way, which are my options?
> It all comes back to having some degree of control over the calling
> environment. For example, if it were sufficient that
>
> du -s *.whatever
> and
> eval du -s `myscript`
>
> were equivalent, then
>
> print -r -- ${(q)array}
>
> should be enough.
Which is not. I mean, it is if I use the eval solution (which, as
I told Wayne, I had tested before without success, probably a typo.
Oh, no, examining my history, the problem was the missing 'q' flag,
that's all).
> } I've been trying this (without success):
> } command $(printf '"%s "' $array)
> Even if that would work (which, as you've seen, it does not) why would
> you want to include a trailing space *inside* the double quotes?
A typo, my fault O:)
> } The worst thing is that I had the intention of using a couple
> } more scripts in this way, generating a list of files to work on and
> } dumping it to stdout :( but without being able to solve this
> } problem...
>
> Well, you could always change tack entirely and instead of
>
> du -s `myscript`
>
> you could call
>
> myscript du -s
>
> That is, have your script work the way zargs does.
This is a bit difficult because it forces me to change the way
that the command line is parsed. I mean, the script gets a globbing
pattern or a list of files to process (and produces another list),
and if one of the parameters is a command, I must think about a way
of separating it from the list of files. Something like:
myscript -c "du -s" files...
Not much difficult (the script already uses 'getopts') but a bit
messy if I must pass parameters with spaces in them in the command.
It's much easier to use eval, then. Obviously I can use zargs as a
model (using "-- command args"). I think that it could be the way...
> Or you could modify
> zargs to use ${(z)...} on its list of files, and then run
>
> qzargs -- `myscript` -- du -s
>
> But again all of this assumes you can control the caller, which means
> you could just as easily require IFS=$'\0'.
Do you mean something like this?:
IFS=$'\0' du -s `myscript`
Because it doesn't work, neither (nor exporting IFS with NULL as
its value, zsh still splits on spaces).
I'm thinking about another solution that could be better, since
sometimes I want to manually review the list before passing it to the
command (and the scripts generates a *different* list each time is
called):
array=(`myscript args`)
and making 'myscript' to do a simple 'print -l'. Obviously, the
problem is more or less the same, I need 'eval' or something like
that. Could I do the above, using 'print -N', and after that forcing
the split in NULLs? I've tested this (doesn't work):
array=(`print -N -- $list`)
print -l ${(s:$'\0':)array}
I can use 'eval', of course:
eval array=\(`print -r -- ${(q)list}`\)
But it is even more messy to write than using the command itself,
so... Obviously I'm missing a lot of things here :( but this is the
perfect solution (using an array, I mean) because that allows me to
review the generated list and using it afterwards for more than one
command (which I do frequently, so it will be better than just do
something like "eval command `myscript`"). Any way of doing this
without much mess?
Thanks a lot for all the help and teaching you're providing :)
Raúl Núñez de Arenas Coronado
--
Linux Registered User 88736 | http://www.dervishd.net
http://www.pleyades.net & http://www.gotesdelluna.net
It's my PC and I'll cry if I want to...
Messages sorted by:
Reverse Date,
Date,
Thread,
Author