Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: [RFC] adding zmktemp command



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, or name it something else (which I did, gmktemp).  Either way this makes for less portable scripts.  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.


- There's already a gettempname() function in the shell's C implementation;
   it relies on mktemp(3) being available.  A module implementation might
   be able to reuse that.
Actually I was thinking about modifying this as well to use either a system mkstemps where available or a hand-rolled one.  The names generated on HP-UX by mktemp(3) are extremely predictable (basically it zero-pads the pid and starts incrementing the leftmost digit on subsequent calls.  This is likely to be a bigger deal in a shell script where the tempfile might be repeatedly opened and closed and the name handed off as an argument to an external command, than internally where all I/O to the file is done with an already opened file descriptor.

- 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.


(I think you're aware of the following, but for the record:)

There is a *limited* workaround: '() { … } =(:)' creates a tempfile (in
${TMPPREFIX:h}, if that's set).  The catch is that the file is deleted
when the anonymous function returns, so it's effectively a lexically
scoped tempfile.  And, of course, it's not a substitute for «mktemp -d».
(So, no, that's not a replacement to a proper mktemp(1).)

Cheers,

Daniel



Messages sorted by: Reverse Date, Date, Thread, Author