zsh-workers
 help / color / mirror / code / Atom feed
From: Clinton Bunch <cdb_zsh@zentaur.org>
To: Daniel Shahaf <d.s@daniel.shahaf.name>, zsh-workers@zsh.org
Subject: Re: [RFC] adding zmktemp command
Date: Fri, 29 Mar 2019 10:20:38 -0500	[thread overview]
Message-ID: <c3b048fa-58de-d14a-ca69-1433d91c05cc@zentaur.org> (raw)
In-Reply-To: <20190328211359.prb6pdpidcgq5xn6@tarpaulin.shahaf.local2>


On 3/28/2019 4:13 PM, Daniel Shahaf wrote:
> Clinton Bunch wrote on Thu, Mar 28, 2019 at 10:00:24 -0500:
>> On 3/28/2019 4:38 AM, Daniel Shahaf wrote:
>>> Clinton Bunch wrote on Wed, 27 Mar 2019 21:18 +00:00:
>>>> I'm thinking of adding a zmktemp command either in a new module (e.g.
>>>> zsh/tempfile) or in the zsh/files module.
>>> ...
>>>> Thoughts?
>>> A few.
>>>
>>> - I wonder if implementing mktemp in the shell is easier than expecting
>>>     people to install a third-party mktemp(1) binary with whatever
>>>     functionality they desire.  BSD systems often have both BSD make and
>>>     GNU make, so it's conceivable that HP-UX systems could have both the
>>>     native mktemp(1) and a third-party one.
>>>     (To be clear, I do not object to your RFC; I just wonder if there's a
>>>     better solution to the underlying problem.)
>> That situation is why I proposed this.  On my HP-UX systems I use gnu
>> coreutils mktemp, but either I have to order my path so that it's before
>> /usr/bin, which can get me non-standard versions of standard commands which
>> might affect the script,
> You neglected to explain why none of the other possible solutions to
> this subproblem is suitable for you.  (For starters, there are 'add a
> directory to the front of $PATH that contains just GNU mktemp and
> nothing else' and 'use the "hash" builtin to specify a different mktemp
> than the one in $PATH'.)
Didn't think of the hash builtin.
>
>> or name it something else (which I did, gmktemp).
>> Either way this makes for less portable scripts.
> So your problem statement is "HP-UX and Linux use incompatible mktemp(1)
> binaries".  I don't understand why that should be fixed in zsh;
> shouldn't that be fixed by getting HP-UX to improve their mktemp?
> Compare how there is any number of instances in the FreeBSD man pages of
> option flags that have been added for compatibility with coreutils (see
> ls(1) and find(1) for example).

Fixing the incompatibilities of HP-UX mktemp requires more than adding a 
few ignored options.  It doesn't make temporary directories and in fact 
uses -d to specify the directory to create the file.  It doesn't take a 
template string.  And most importantly doesn't create the temporary file 
by default (you have to give a -c option to do so).  It also uses the 
highly predictable HP-UX mktemp(3) to generate the name.

>
> (By the way: I wonder if mktemp(1) will be added to POSIX?)
It should, but who knows if it will.
>
> As to your proposal itself, I initially thought you were proposing to
> implement a drop-in replacement of some mktemp(1) out there (probably
> GNU's, though for license reasons it'd be easier to crib BSD's);
> however, reading your responses to Peter and Oliver I see that you might
> be thinking of adding an *idiomatic* make-temporary-files interface,
> e.g., one that returns an fd and/or returns the filename in REPLY to
> save a fork.  Which is it?  Could you sketch the API that will be
> provided to script authors?  Is it "see GNU coreutils' mktemp(1) man
> page, plus the -f option to return an fd"?

I'm thinking of something that *could* be used as a drop-in replacement 
for mktemp (from the online man pages I can find, other than HP-UX, the 
other *nix with mktemp accept the same short options as GNU), but I want 
to make it better (that seems to be the zsh way :)

The -f var option mentioned elsewhere to return the opened file descriptor.

a -i (invisible) that will unlink the file as soon as it's opened.  (Not 
sure what the use case for this is, but there must be one as both 
stdio's tempfile and perl's File::Temp (as an option) offer this 
functionality)

a -E to erase the file on exit (if I can figure out how to use the exit 
hook)

a -e to clear the FD_CLOEXEC on the file descriptor so external programs 
could inherit the open file descriptor (perhaps useful on those systems 
with /dev/fd or with other specially written programs)

>
>> That also requires that
>> the script writer have access to install packages or the wherewithal to
>> build these packages and install them in their home directory themselves.
> By this argument, we should ship an rsync implementation in zsh if HP-UX
> doesn't happen to ship rsync in part of its (HP-UX's) default installation.
I suppose that argument could be made, but opening temp files is a much 
more common use case than rsync.  To be honest I've used temp files in 
scripts a lot more often than some of the other builtins in zsh/files 
like chgrp or chown
>
>>> - O_EXCL is exposed by zsh/system's 'sysopen' builtin, so a pure zsh
>>>     implementation should be possible.
>> I didn't think about a pure zsh implementation, but modifying the template
>> character by character in zsh sounds like at least as much work as it is in
>> C, but slower.
> Given that there's going to be a syscall at the end anyway [open(O_EXCL)],
> I'm not sure if the overhead of zsh over pure C would be noticeable.
>
> I mentioned a pure zsh implementation because it could be implemented as
> an autoloaded function and released as a plugin (rather than a module),
> so it would be installable by users who don't or can't compile their own
> zsh, and it would even be compatible with existing zsh binaries out
> there.
That wouldn't allow the -i option or the -e mentioned above.
> Cheers,
>
> Daniel

  reply	other threads:[~2019-03-29 15:23 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <CGME20190327211847epcas2p395ce077891a4535f19e1e9605217df7c@epcas2p3.samsung.com>
2019-03-27 21:16 ` Clinton Bunch
2019-03-28  9:38   ` Daniel Shahaf
2019-03-28 15:00     ` Clinton Bunch
2019-03-28 21:13       ` Daniel Shahaf
2019-03-29 15:20         ` Clinton Bunch [this message]
2019-03-28 15:17   ` Peter Stephenson
2019-03-28 15:25     ` Clinton Bunch
2019-03-28 15:36   ` Oliver Kiddle
2019-03-28 15:40     ` Clinton Bunch
2019-03-28 20:26       ` Daniel Shahaf

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=c3b048fa-58de-d14a-ca69-1433d91c05cc@zentaur.org \
    --to=cdb_zsh@zentaur.org \
    --cc=d.s@daniel.shahaf.name \
    --cc=zsh-workers@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).