gpt4 book ai didi

ruby - 为什么 xelatex 不想被 popen3 以 vararg 形式调用?

转载 作者:数据小太阳 更新时间:2023-10-29 08:56:25 25 4
gpt4 key购买 nike

以这个最小的 LaTeX 文档为例:

% minimal.tex
\documentclass{article}

\begin{document}
Hello World!
\end{document}

还有这个 Ruby (2.5.1) 脚本:

require 'open3'

Open3.popen3(
'xelatex', '-interaction=nonstopmode', '"minimal.tex"'
) do |_stdin, stdout, stderr, wait_thr|
log = stdout.readlines + stderr.readlines
exit_status = wait_thr.value

puts exit_status
puts log.join('').strip!
end

运行脚本,我们得到:

This is XeTeX, Version 3.14159265-2.6-0.99999 (TeX Live 2018) (preloaded format=xelatex)
...
! I can't find file `'"minimal.tex"''.

这令人惊讶。不仅因为文件存在,而且因为两者

  • Open3.popen3('xelatex -interaction=nonstopmode "minimal.tex"') 做...
  • Open3.popen3('lualatex', '-interaction=nonstopmode', '"minimal.tex"') 做...

工作得很好!

xelatexpopen3的结合有什么特别之处?

最佳答案

Open3.popen3(
'xelatex', '-interaction=nonstopmode', 'minimal.tex'
)

工作正常。

错误信息告诉你,文件 "minimal.tex" 不存在。

使用 popen3 的可变参数形式,commands 数组被传递给 Process#spawn,其中 xelatex 被调用 arg1= -interaction=nonstopmodearg2=minimal.tex。参数不会传递给 shell。旁注,这样您还可以使用“复杂”参数调用其他进程,例如Open3.popen3('mkdir', '带空格和 $SHELL 的目录')

Ad Open3.popen3('xelatex -interaction=nonstopmode "minimal.tex"'):这里,整个字符串被认为是发送到标准 shell 的命令,这个 shell 接受注意双引号。

Ad Open3.popen3('lualatex', '-interaction=nonstopmode', '"minimal.tex"'):这里我只能猜测 lualatex 忽略了双引号。

另请参阅:https://ruby-doc.org/core-2.2.0/Process.html#method-c-exec

关于ruby - 为什么 xelatex 不想被 popen3 以 vararg 形式调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55735773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com