From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12590 invoked by alias); 20 Apr 2016 03:33:08 -0000 Mailing-List: contact zsh-users-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Users List List-Post: List-Help: X-Seq: 21459 Received: (qmail 372 invoked from network); 20 Apr 2016 03:33:06 -0000 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,HTML_MESSAGE, LOTS_OF_MONEY,T_DKIM_INVALID autolearn=ham autolearn_force=no version=3.4.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=benizi-com.20150623.gappssmtp.com; s=20150623; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to; bh=aeTYW2wdxUAbDukSewdpBtzryfyd6CLZ59Q6KEhOKhk=; b=gLIhPwD/NpJReSRKCDyxu+Za6PM3KyUbPKmYZxOxOmQO3nOBtSNg+afiVePF71P24A VMNcIHBCDOQX35QkwzRFhf3C1DnTx70TxKpjUjjHPZeS5EGAY6814QjLdopQu2ZxG61W GBFOdk+aWfPdEX8Tl8D84LwrIRTwAJP7m1oeE3c/Afs7WVs6KKQedkZM36Y4zoEHzZWo 01A67IaRqSWU2wY/e/vZLp5L8rIsFgdGYS++IIFtgFr90x0hkySbO8yShure0p4QKFBj WR8TRjK/ttSbJRX54YWmBT9s0oGlesEcRIyWIh/H/y/hZ1rFyHw4jd4XNy52IN7WlxWM qasA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:from :date:message-id:subject:to; bh=aeTYW2wdxUAbDukSewdpBtzryfyd6CLZ59Q6KEhOKhk=; b=CUPXGXwAf55Wm8hHEqVZl4qMVYbobeOxyx5UaskPn/mhokIvEo6YcJyhHMJwLDbgSZ fLuzwvoohSzUR7xZUMg/t4fW5oFtbgVQI+cx5IgFsTeRZzLKta1T86yeQmGRDxUrBni+ 7RS4esUqvoz+EmKHtJyT9s2TX9VMqzU+/UtKBy32Zl5stKcAeAiNJn+eIH6ARCnKZDGp M8scJVEkRpRMG/oZGoKqHpM7wy7A6F6xeacMix30qhDCB++qzEArnwRz3DIjc/x1t57J 7Zz7sqEzSHh94jUBHxiTPo6zoCRn+6N+2zUpRnzHok9AfzvEi4PESt60sz5i3UD1XDYZ 8dww== X-Gm-Message-State: AOPr4FUMVrdsLudBUbu5YP/jtHSHnoBsymAxfjA5Q2Z5XxnHIQNe9KdFt2FYr95abpy1AXLwWDef0u5RVROanw== X-Received: by 10.157.13.227 with SMTP id 90mr3020044ots.79.1461123180458; Tue, 19 Apr 2016 20:33:00 -0700 (PDT) MIME-Version: 1.0 Sender: benizi@benizi.com In-Reply-To: <8760vdrt5y.fsf@student.uu.se> References: <8760vdrt5y.fsf@student.uu.se> From: "Benjamin R. Haskell" Date: Tue, 19 Apr 2016 23:32:41 -0400 X-Google-Sender-Auth: nQJByWtNh8aqrciUwFjEfL2eKXA Message-ID: Subject: Re: virtual files? To: Zsh-Users List Content-Type: multipart/alternative; boundary=94eb2c110014250d100530e240c9 --94eb2c110014250d100530e240c9 Content-Type: text/plain; charset=UTF-8 On Tue, Apr 19, 2016 at 9:00 PM, Emanuel Berg wrote: > Here is a program I just wrote. > > Feel free to comment on any part. > > However my specific question is, instead of using the > "result_file" stuff, is there support for > I suppose "virtual files" or basically a data structure > that can be used transparently as a file, or with but > small adjustments? > > TIA. > > #! /bin/zsh > > # This file: http://user.it.uu.se/~embe8573/conf/.zsh/money > > # zsh CLI to Internet inflation calculator. > # > # Try, for example, three K2 expeditions: > # > # $ inflation 9000 1938; inflation 30958.33 1953; inflation 108000 1954 > # > # which yields: > # > # $151,999.15 > # $276,111.20 > # $956,069.00 > > inflation () { > local usd=${1:-10} > > # year > local then=${2:-1950} > local now=`date +"%Y"` > > local result_file=result > > local link=" > http://data.bls.gov/cgi-bin/cpicalc.pl?cost1=$usd&year1=$then&year2=$now" > wget -q $link -O $result_file > > echo -n \$ > grep \"answer\" $result_file | cut -d \$ -f 2 | cut -d \< -f 1 > > rm $result_file > } > Using the `=()` substitution ZyX mentions: inflation () { local usd=${1:-10} # year local then=${2:-1950} local now=`date +"%Y"` local link=" http://data.bls.gov/cgi-bin/cpicalc.pl?cost1=$usd&year1=$then&year2=$now" () { local tmp=$1 wget -q $link -O $tmp echo -n \$ grep \"answer\" $tmp | cut -d \$ -f 2 | cut -d \< -f 1 } =(:) } The '() { ... }' construct is an anonymous function, just for controlling the scope of the temporary file, and for passing it in as a positional parameter. It has the disadvantage that it won't remove the tmp file if something goes wrong. Personally, for portable scripts (not usually functions), I tend to use `mktemp` + `trap cleanup INT QUIT EXIT` (where `cleanup` is a per-script function for removing whatever temp files I create in that script). E.g., in this case, since it's a single tmp file, you may as well inline the trap body: inflation () { local usd=${1:-10} # year local then=${2:-1950} local now=`date +"%Y"` local link=" http://data.bls.gov/cgi-bin/cpicalc.pl?cost1=$usd&year1=$then&year2=$now" # not sure which of these are default: setopt local_options no_posix_traps local_traps err_return # -t means "use $TMPDIR" for some `mktemp`s, "next arg is template" for others local tmp=$(mktemp -t inflation.data.XXXXXXXX) # remove the tmp file on exit, if it was set up properly trap '[[ -z $tmp ]] || rm $tmp' INT QUIT EXIT wget -q $link -O $tmp echo -n \$ grep \"answer\" $tmp | cut -d \$ -f 2 | cut -d \< -f 1 } Another possibility is the use of `coproc` (which I only see mentioned twice in `zshall(1)`), so I feel like it doesn't get used often, and only works in this case because `wget` is capable of using stdout: (but is nonetheless potentially interesting): inflation () { local usd=${1:-10} # year local then=${2:-1950} local now=`date +"%Y"` local link=" http://data.bls.gov/cgi-bin/cpicalc.pl?cost1=$usd&year1=$then&year2=$now" coproc wget -q $link -O - echo -n \$ grep \"answer\" <&p | cut -d \$ -f 2 | cut -d \< -f 1 } The `coproc` preceding the `wget` starts a background process, then `>&p` = write to the process (not used here), `<&p` = read from the process (used for the input to `grep`). Also, I prefer `curl` over `wget`, and if you're curious, here's how I might write the entire function: inflation() { curl -s -d cost1=${1:-10} -d year1=${2:-1950} -d year2=$(date +%Y) \ http://data.bls.gov/cgi-bin/cpicalc.pl | awk '/"answer"/' | tr -d -c '$0-9.,\n' } (Though the create-a-tempfile problem is certainly interesting in its own right.) -- Best, Ben --94eb2c110014250d100530e240c9--