[luatex] os.execute v \write18

Hans Hagen pragma at wxs.nl
Fri Nov 20 17:44:45 CET 2015

On 11/20/2015 2:29 PM, David Carlisle wrote:
> Been looking at how easy it is to switch from \write18 to os.execute
> (in particular whether you can emulate the former with the latter).
> I got so far but wondered if I'd missed a trick that luatex has (it
> would not be the first time:-)
> Attached is a plain tex file that by default fails to input
> \jobname.bbl (as shell escape restricted) but succeeds if
> --shell-escape is given
> Version B commented out uses bibtex instead of echo and that one
> succeeds without --shell-escape assuming the standard texlive
> settings of
> shell_escape_commands = \
> bibtex,bibtex8,\
> extractbb,\
> kpsewhich,\
> makeindex,\
> mpost,\
> repstopdf,\
> as bibtex is allowed to make the bbl file with restricted shell escape.

these all look immediate to me

> That's all good so far, but I'd be happy to take criticism of my lua code:-)
> If the \write18 call did not have \immediate in front of it then the
> lua ought to be called via \latelua rather than \directlua
> (non immediate write18 is probably not used much, but you never know)
> Is there any way to detect (in tex or lua) that there is a "pending"
> \immediate and to delay the execution if not?

actually the immediate issue was why i kept the 18 as special case

now, personally i never needed a non-immediate and os.execute is like 
that (unless wrapped in latelua) so that is why dropping 18 is not that 
big a deal

> I could of course try to redefine \immediate to set some flag but it's
> a fragile thing and hard to redefine as a macro and get reasonably
> similar behaviour.

the problem with immediate is that it is not really a prefix like 
\global or \protected or ... but part if the extension loop and there it 
is just a flag and not a state (latelua is done elsewhere) .. in fact 
immediate is some kind of no-op otherwise (i considered making it some 
state but then we have rather tricky reset / expansion interactions so i 
rejected that)

so, adding extra \immediate overhead and complexity for the sake of 
execute is not going to happen

(some time ago i played more than a day with that conceptual mess and in 
the end reverted all)

> I had wondered if, rather than redefine \write, there would be some
> lua callback on writes that I could use to divert the write to a
> system call if stream=18,but I think not.


> Any suggestions welcome....

just provide two commands:

\delayedsystemcommand  {...}

> Ignoring the issue and always doing the system call immediately is a
> possibility: anyone wanting a system call at shipout time could use
> \latelua{os.execute()} directly


> but it does affect the details of what we can say about cross engine
> compatibility.

so make a specific execute command and implement it different for 
different engines

write18 was a strange animal anyway


                                           Hans Hagen | PRAGMA ADE
               Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
     tel: 038 477 53 69 | voip: 087 875 68 74 | www.pragma-ade.com
                                              | www.pragma-pod.nl

More information about the luatex mailing list