From: "Benjamin R. Haskell" <zsh@benizi.com>
To: Zsh-Users List <zsh-users@zsh.org>
Subject: Re: virtual files?
Date: Tue, 19 Apr 2016 23:32:41 -0400 [thread overview]
Message-ID: <CAB2RFrTTibd-8FLs5GoGbMiTS2Gk8L8CVq1gC5im_8LmF3F6Zw@mail.gmail.com> (raw)
In-Reply-To: <8760vdrt5y.fsf@student.uu.se>
[-- Attachment #1: Type: text/plain, Size: 3760 bytes --]
On Tue, Apr 19, 2016 at 9:00 PM, Emanuel Berg <embe8573@student.uu.se>
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
next prev parent reply other threads:[~2016-04-20 3:33 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-20 1:00 Emanuel Berg
2016-04-20 1:27 ` Nikolay Aleksandrovich Pavlov (ZyX)
2016-04-20 2:12 ` Emanuel Berg
2016-04-20 2:31 ` Nikolay Aleksandrovich Pavlov (ZyX)
2016-04-20 4:03 ` Bart Schaefer
2016-04-20 6:06 ` Emanuel Berg
2016-04-21 22:14 ` Emanuel Berg
2016-04-22 1:08 ` Bart Schaefer
2016-04-20 3:32 ` Benjamin R. Haskell [this message]
2016-04-20 20:34 ` Bart Schaefer
2016-04-22 5:26 ` Benjamin R. Haskell
2016-04-21 4:12 ` Emanuel Berg
2016-04-21 6:58 ` Bart Schaefer
2016-04-21 8:05 ` Emanuel Berg
2016-04-22 5:55 ` Benjamin R. Haskell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAB2RFrTTibd-8FLs5GoGbMiTS2Gk8L8CVq1gC5im_8LmF3F6Zw@mail.gmail.com \
--to=zsh@benizi.com \
--cc=zsh-users@zsh.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).