When some external data is substituted into a Maxima command
(batchload this case) there should be an extra pass of escaping that
protects special characters like quotes (and backslashes?) accordingly
to Maxima rules.
Not necessarily, Maxima is capable of understanding unescaped paths, for
example, this works:
maxima --very-quiet -r "batchload(\"/tmp/sp
ce/babel-gxqTkM/maxima-ua3e9j.max\")"$
I suspect that quotes your added around %S must not be used there. Due
to them file name appears outside of quotes at all.
Yes, good catch.
Unsure concerning Maxima but usually it is possible to pass arguments
avoiding quoting issues for particular language.
Command line Maxima actually has a batch flag, but using it returns the
entire input file in the output too and that seems to be the reason why
the original authors of ob-maxima didn't use it. It's probably possible
to filter that on our side, but such filtering would require extra work,
which they probably deemed unnecessary, for such a rather obscure set of
use cases.
Anyway, I've tried to get it to work using shell-quote-argument, see the
attached patch. Seems to work well enough in practice on both platforms
and for cases like (setq temporary-file-directory "/tmp/`echo hi`/").
From 47690d14ac4838d8e39f08bd8224f0b4af053359 Mon Sep 17 00:00:00 2001
From: Nikolay Kudryavtsev <nikolay.kudryavt...@gmail.com>
Date: Sun, 26 Dec 2021 22:47:19 +0300
Subject: [PATCH] ob-maxima.el: Fix execution on MS Windows
* ob-maxima.el (org-babel-execute:maxima): Change command line
invocation to a one that should work everywhere.
---
lisp/ob-maxima.el | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/lisp/ob-maxima.el b/lisp/ob-maxima.el
index 7b49bb07a..08b586414 100644
--- a/lisp/ob-maxima.el
+++ b/lisp/ob-maxima.el
@@ -77,8 +77,11 @@ This function is called by `org-babel-execute-src-block'."
(result
(let* ((cmdline (or (cdr (assq :cmdline params)) ""))
(in-file (org-babel-temp-file "maxima-" ".max"))
- (cmd (format "%s --very-quiet -r 'batchload(%S)$' %s"
- org-babel-maxima-command in-file cmdline)))
+ (cmd (format "%s --very-quiet -r %s$ %s"
+ org-babel-maxima-command
+ (shell-quote-argument
+ (format "batchload(%S)" in-file))
+ cmdline)))
(with-temp-file in-file (insert (org-babel-maxima-expand body
params)))
(message cmd)
;; " | grep -v batch | grep -v 'replaced' | sed '/^$/d' "
--
2.34.1.windows.1