为什么 xelatex 不想被 popen3 以 vararg 形式调用?
Why does xelatex not want to be called by popen3 in vararg form?
使用这个最小的 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"') do ...
和
Open3.popen3('lualatex', '-interaction=nonstopmode', '"minimal.tex"') do ...
工作得很好!
xelatex
和popen3
的组合有什么特别之处?
Open3.popen3(
'xelatex', '-interaction=nonstopmode', 'minimal.tex'
)
工作正常。
报错信息告诉你,文件"minimal.tex"
不存在。
使用 popen3 的可变参数形式,commands
数组被传递给 Process#spawn
,其中 xelatex
通过 arg1=-interaction=nonstopmode
和 arg2=minimal.tex
调用。参数不会传递给 shell。旁注,这样您还可以使用 "complex" args 调用其他进程,例如Open3.popen3('mkdir', 'directory with spaces and $SHELL')
.
Ad Open3.popen3('xelatex -interaction=nonstopmode "minimal.tex"')
:在这里,整个字符串被认为是发送到标准 shell 的命令,而这个 shell 负责双引号。
广告Open3.popen3('lualatex', '-interaction=nonstopmode', '"minimal.tex"')
:这里我只能猜测lualatex忽略了双引号。
另请参阅:https://ruby-doc.org/core-2.2.0/Process.html#method-c-exec
使用这个最小的 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"') do ...
和Open3.popen3('lualatex', '-interaction=nonstopmode', '"minimal.tex"') do ...
工作得很好!
xelatex
和popen3
的组合有什么特别之处?
Open3.popen3(
'xelatex', '-interaction=nonstopmode', 'minimal.tex'
)
工作正常。
报错信息告诉你,文件"minimal.tex"
不存在。
使用 popen3 的可变参数形式,commands
数组被传递给 Process#spawn
,其中 xelatex
通过 arg1=-interaction=nonstopmode
和 arg2=minimal.tex
调用。参数不会传递给 shell。旁注,这样您还可以使用 "complex" args 调用其他进程,例如Open3.popen3('mkdir', 'directory with spaces and $SHELL')
.
Ad Open3.popen3('xelatex -interaction=nonstopmode "minimal.tex"')
:在这里,整个字符串被认为是发送到标准 shell 的命令,而这个 shell 负责双引号。
广告Open3.popen3('lualatex', '-interaction=nonstopmode', '"minimal.tex"')
:这里我只能猜测lualatex忽略了双引号。
另请参阅:https://ruby-doc.org/core-2.2.0/Process.html#method-c-exec