在 LuaTeX 中执行系统命令

在 LuaTeX 中执行系统命令

(编辑:如何以独立于操作系统的方式使用 LuaTeX 执行文件系统操作和二进制执行?我为 pdfTeX 编写了一组宏,以便使用命令执行此操作\write18。这些宏旨在在 Windows 和 Linux 下使用,提供一些“更高级别”的控制。现在我希望宏也支持 LuaTeX。然而,我的第一次实验没有成功。试图通过省略所有宏并在命令行上执行 LuaTeX 来减少问题,结果将注意力误导到一个不重要的问题上,几天后我才找到解决方案。)

在最小测试环境中(参见 LuaMetaTeX 的最小测试环境)我可以做初始内存转储

    luatex --ini ./plain.tex \dump

然后我希望以下命令列出目录:

    luatex --fmt=./plain.fmt --shell-escape \directlua {os.execute ("dir")}\end

但它只是告诉我:

    This is LuaTeX, Version 1.13.2 (TeX Live 2021/W32TeX)
     system commands enabled.
    No pages of output.
    Transcript written on texput.log.

那么,如何在 LuaTeX 下执行系统命令,就像在 pdfTeX 下可以执行一样\write18

答案1

正如@David 所解释的那样,我通过在 shell 提示符下输入 LuaTeX 命令而没有使用必要的引号,过度简化了此测试,因此我没有获得预期的输出。在文档中,同一命令不能使用引号,问题转移到将系统的输出转换为命令序列。这个想法是在和下都能运行,而unix在pdfTeX 下或如果未设置windows则正常失败。--shell-escape

    \def \system #1#2#3{{%
      % #1: unix command, #2: windows command, #3: control sequence (return value) 
      \xdef #3{}%
      \ifx \directlua \undefined
        \message {! No \string\directlua\space support (LuaTeX required).}%
      \else
        \edef \escapestate {\directlua {tex.write (status.shell_escape)}}%
        \def \one {1}%
        \ifx \escapestate \one
          \edef \ostype {\directlua {tex.print (os.type)}}%
          \def \unix {unix}% os.type can be "unix", "windows", or "msdos"
          \directlua {% 
            \ifx \ostype \unix
              local file = io.popen ([[#1]]);
              os.execute ([[#1]]);
            \else
              local file = io.popen ([[#2]]);
              os.execute ([[#2]]);
            \fi 
            local content = file:read "*a";
            file:close ();        
            tex.toks [5] = content; }%
          \xdef #3{\the \toks 5}%
        \else \message {! No --shell-escape switch set for system command.}\fi
      \fi }}  

    \bgroup \newlinechar = 10     
      \system {setterm --clear}{cls}\myresult  
      \system {time}{time /t}\myresult
        \message {^^JSystem time:^^J\myresult}   
      \system {cd}{cd}\myresult
        \message {^^JCurrent folder:^^J\myresult}  
      \system {ls -l}{dir /b}\myresult
        \message {^^JFiles in current folder:^^J\myresult}  
      \system {set}{set}\myresult
        \message {^^JEnvironment variables:^^J\myresult}  
    \egroup \end

将以上文件另存为curdir.tex并运行:

    luatex --fmt=plain --output-format=pdf --shell-escape ./curdir.tex \end

相关内容