From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3437 invoked from network); 12 Aug 2005 08:26:06 -0000 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by ns1.primenet.com.au with SMTP; 12 Aug 2005 08:26:06 -0000 Received: (qmail 7878 invoked from network); 12 Aug 2005 08:26:00 -0000 Received: from sunsite.dk (130.225.247.90) by a.mx.sunsite.dk with SMTP; 12 Aug 2005 08:26:00 -0000 Received: (qmail 10467 invoked by alias); 12 Aug 2005 08:25:53 -0000 Mailing-List: contact zsh-users-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 9303 Received: (qmail 10457 invoked from network); 12 Aug 2005 08:25:52 -0000 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by sunsite.dk with SMTP; 12 Aug 2005 08:25:52 -0000 Received: (qmail 6882 invoked from network); 12 Aug 2005 08:25:52 -0000 Received: from ns9.hostinglmi.net (213.194.149.146) by a.mx.sunsite.dk with SMTP; 12 Aug 2005 08:25:44 -0000 Received: from 212.red-80-35-44.pooles.rima-tde.net ([80.35.44.212] helo=localhost) by ns9.hostinglmi.net with esmtpa (Exim 4.51) id 1E3UrJ-0002ED-CT; Fri, 12 Aug 2005 10:25:45 +0200 Date: Fri, 12 Aug 2005 10:29:09 +0200 From: DervishD To: Bart Schaefer Cc: Zsh Users Subject: Re: Printing arrays for use with $() Message-ID: <20050812082909.GB354@DervishD> Mail-Followup-To: Bart Schaefer , Zsh Users References: <20050811161654.GA8200@DervishD> <1050811163714.ZM2498@candle.brasslantern.com> <20050811170124.GA8279@DervishD> <20050811222847.GA341@DervishD> <1050812022700.ZM12607@candle.brasslantern.com> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1050812022700.ZM12607@candle.brasslantern.com> User-Agent: Mutt/1.4.2.1i Organization: DervishD X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - ns9.hostinglmi.net X-AntiAbuse: Original Domain - sunsite.dk X-AntiAbuse: Originator/Caller UID/GID - [0 0] / [47 12] X-AntiAbuse: Sender Address Domain - dervishd.net X-Source: X-Source-Args: X-Source-Dir: X-Spam-Checker-Version: SpamAssassin 3.0.4 (2005-06-05) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.0.4 Hi Bart :) * Bart Schaefer 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...