Scheme 带pdflatex的Guile方案系统*jobname

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

我正试图从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
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那样完成任何魔法。