我\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 显示了如何直接\input
从date
命令中获取。它还显示了如何通过 来\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 扩展的情况下运行(现在您通常都是这么做的),最好使用\readline
inn 而不是。\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}