Scheme 带pdflatex的Guile方案系统*jobname
我正试图从guile scheme文件调用Scheme 带pdflatex的Guile方案系统*jobname,scheme,gnu,guile,Scheme,Gnu,Guile,我正试图从guile scheme文件调用pdflatex。这是我正在使用的Guile命令: (系统)* “cat”“foo.txt”“|”“pdflatex”“-jobname”“bar\”) 这是我在运行文件后返回的错误: cat: invalid option -- 'j' Try 'cat --help' for more information. 如果我从bashshell运行命令,它将正常运行 cat foo.txt | pdflatex-作业名“bar” -jobname是p
pdflatex
。这是我正在使用的Guile命令:
(系统)*
“cat”“foo.txt”“|”“pdflatex”“-jobname”“bar\”)
这是我在运行文件后返回的错误:
cat: invalid option -- 'j'
Try 'cat --help' for more information.
如果我从bashshell运行命令,它将正常运行
cat foo.txt | pdflatex-作业名“bar”
-jobname
是pdflatex
的正确命令,但是system*
似乎有问题
我正在使用(GNU Guile)2.2.4和pdfTeX 3.14159265-2.6-1.40.20。使用
系统,而不是系统*
。它使用单个字符串作为参数,并使用shell执行它,shell将执行所需的管道
(system "cat foo.txt | pdflatex -jobname 'bar'")
system*
不使用shell。正如秘书长解释的那样:
system*
与system类似,但每个参数只接受一个字符串,不执行shell解释。该命令使用fork和execlp执行。因此,在不需要外壳解释的情况下,该功能可能比系统更安全
请注意,您的命令是一个,因为pdflatex
将文件名作为参数。您可以使用system*
直接执行它
(system* "pdflatex" "-jobname" "bar" "foo.txt")
另外,当您使用system*
时,不需要在bar
周围添加额外的引号;因为它不使用shell,所以它不会解析特殊字符。这不是执行shell命令,它运行的是cat
程序,其他所有内容都作为参数。因此它不会像
那样解析shell语法来表示管道。@Barmar我一定没有使用系统*
。如果不使用system*
,我想没有一种方法可以将字符串从scm发送到pdflatex,这就是我遇到这个问题的原因?虽然这可以一次性使用,但请注意,使用system
意味着您不仅需要确切知道字符串包含的内容,您还需要确切地知道shell将如何解释它。这太难了,实际上是不可能的。@tfb我添加了另一个不使用管道的命令版本,所以你可以使用system*
来避免这个问题。我并不是想对你的答案感到不快。顺便说一句:我认为第一个答案适用于你不必在意的情况:更一般的字符串中的language-in-a-string大小写是最可怕的。如果Guile有办法用语言来处理管道,而不是调用shell,这将是最佳选择。我对Guile不太了解。我也不太了解。虽然正如你指出的,这里根本不需要管道,但要像外壳中的管道那样高效,通常是非常困难的。popen的确有一些变体,但如果你最终得到一个循环写入字节的流,那么你就不能像现代OSs上的I/O那样完成任何魔法。