获取 `\write18` 的返回值

获取 `\write18` 的返回值

\immediate\write18{./somescript.sh}在 latex 编译过程开始时执行自己的 shell 脚本。是否可以在之后获取返回值?

答案1

使用 shell 工具的一个非常基本的方法:

使用重定向将脚本执行状态(脚本本身或最后一个命令)写入外部文件,>然后将此生成的文件读入\def\foomacro.

\documentclass{book}

\newread\myscriptresult

\begin{document}
\immediate\write18{./myscript.sh; echo $? > scriptresult.txt}
\immediate\openin\myscriptresult=scriptresult.txt
\read\myscriptresult to \ScriptResult
\immediate\closein\myscriptresult

The result was \ScriptResult

\end{document}

myscript.sh

#!/bin/bash

ls -la

答案2

以下 MWE 显示了如何直接\inputdate命令中获取。它还显示了如何通过 来\read将 的输出date置于控制序列中\openin

\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}

\newread\teststream
\newcommand*\testline{}
\openin\teststream=|date
\ifeof\teststream
    \typeout{Unable to open test stream.}
\else
    \typeout{Test stream opened.}
    \read\teststream to \testline
    \typeout{\testline}
\fi

\begin{document}
\input{|date}
\end{document}

但是,为了避免特殊字符的问题,如果您在启用 e-TeX 扩展的情况下运行(现在您通常都是这么做的),最好使用\readlineinn 而不是。\read

当然,上面的代码需要你启用shell-escape功能。

添加

我认为添加几个相关(问题和)答案的参考可能会有所帮助:首先(最重要的是)Write18:捕获 shell(脚本)输出作为命令/变量?;然而,这个问题的答案(或另一个相关的) 提到“管道输入”功能也适用于\openin。因此,我冒昧地引用包含/输入子文件夹中的每个子文件,即使其中包含我自己的答案(这肯定属于自我推销,不是很好——请原谅)。

答案3

你可以尝试使用我的执行包,它会自动检查退出代码。如果它不等于零,则编译将停止并出现错误:

\documentclass{book}
\usepackage{iexec}
\begin{document}
\iexec{./my-script.sh}
\end{document}

的输出./my-script.sh将自动包含在文档中。可以使用以下quiet选项禁用此功能:

\iexec[quiet]{./my-script.sh}

相关内容