* [BUG] ob-shell: internal representation of cmdline arguments the same
@ 2024-04-28 13:27 Matt
2024-04-29 12:22 ` Ihor Radchenko
0 siblings, 1 reply; 4+ messages in thread
From: Matt @ 2024-04-28 13:27 UTC (permalink / raw)
To: emacs-orgmode
While investigating "[BUG] ob-shell: :shebang changes interpretation of :cmdline" (https://list.orgmode.org/orgmode/18f01342a2f.124ad27612732529.8693431365849276517@excalamus.com/), it was observed that :cmdline 1 2 3 behaves like :cmdline "1 2 3"
The first argument is the first space delimited character following ":cmdline":
#+begin_src bash :cmdline 1 2 3
echo "$1"
#+end_src
#+RESULTS:
: 1
The following makes it seem like command-line arguments may be grouped using quotes:
#+begin_src bash :cmdline "1 2" 3
echo "$1"
#+end_src
#+RESULTS:
: 1 2
The following demonstrates that quotes do not always indicate separate arguments:
#+begin_src bash :cmdline "1 2 3"
echo "$1"
#+end_src
#+RESULTS:
: 1
It was stated that,
#+begin_quote
AFAICT, it's due to how headers are parsed by 'org-babel-parse-header-arguments' using 'org-babel-read'. The cell "\"1 2 3\"" (corresponding to :cmdline "1 2 3") is reduced through 'string-match' to "1 2 3". The cell "1 2 3" (corresponding to :cmdline 1 2 3), on the other hand, passes through. The result is that :cmdline "1 2 3" and :cmdline 1 2 3 become indistinguishable.
#+end_quote
Org mode version 9.7-pre (release_9.6.27-1393-ge0f24a @ /home/ahab/Projects/org-mode/lisp/), commit e0f24a3f6
--
Matt Trzcinski
Emacs Org contributor (ob-shell)
Learn more about Org mode at https://orgmode.org
Support Org development at https://liberapay.com/org-mode
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [BUG] ob-shell: internal representation of cmdline arguments the same
2024-04-28 13:27 [BUG] ob-shell: internal representation of cmdline arguments the same Matt
@ 2024-04-29 12:22 ` Ihor Radchenko
2024-05-01 12:11 ` Max Nikulin
0 siblings, 1 reply; 4+ messages in thread
From: Ihor Radchenko @ 2024-04-29 12:22 UTC (permalink / raw)
To: Matt; +Cc: emacs-orgmode
Matt <matt@excalamus.com> writes:
> #+begin_src bash :cmdline 1 2 3
> ...
> #+begin_src bash :cmdline "1 2 3"
> ...
> It was stated that,
>
> #+begin_quote
> AFAICT, it's due to how headers are parsed by 'org-babel-parse-header-arguments' using 'org-babel-read'. The cell "\"1 2 3\"" (corresponding to :cmdline "1 2 3") is reduced through 'string-match' to "1 2 3". The cell "1 2 3" (corresponding to :cmdline 1 2 3), on the other hand, passes through. The result is that :cmdline "1 2 3" and :cmdline 1 2 3 become indistinguishable.
> #+end_quote
Yes, "1 2 3" and 1 2 3 are the same from the perspective of header arg
parser - on purpose.
The idea is to allow passing arbitrary Elisp objects are values
:header-argument #("fancy" 0 1 (invisible t))
:cmdline "string object"
:foo '(a b c)
To force quotes in the :cmdline one can do
#+begin_src bash :cmdline "\"1 2 3\""
echo "$1"
#+end_src
#+RESULTS:
: 1 2 3
Not a bug.
Canceled.
--
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [BUG] ob-shell: internal representation of cmdline arguments the same
2024-04-29 12:22 ` Ihor Radchenko
@ 2024-05-01 12:11 ` Max Nikulin
2024-05-01 14:02 ` Ihor Radchenko
0 siblings, 1 reply; 4+ messages in thread
From: Max Nikulin @ 2024-05-01 12:11 UTC (permalink / raw)
To: emacs-orgmode
On 29/04/2024 19:22, Ihor Radchenko wrote:
> Matt writes:
>
>> #+begin_src bash :cmdline "1 2 3"
[...]
> To force quotes in the :cmdline one can do
>
> #+begin_src bash :cmdline "\"1 2 3\""
> echo "$1"
> #+end_src
I consider it as a kind of pitfall inconsistent with DWIM concept. An
idea of a kludge is below.
#+begin_src sh :cmdline "1 2 3" :results verbatim
printf '%s\n' "$@"
#+end_src
#+RESULTS:
: 1 2 3
#+begin_src sh :cmdline 1 2 3 :results verbatim
printf '%s\n' "$@"
#+end_src
#+RESULTS:
: 1
: 2
: 3
diff --git a/lisp/ob-core.el b/lisp/ob-core.el
index 73fb70c26..efba97f2c 100644
--- a/lisp/ob-core.el
+++ b/lisp/ob-core.el
@@ -3363,7 +3363,7 @@ (defun org-babel-read (cell &optional
inhibit-lisp-eval)
((save-match-data
(and (string-match "^[[:space:]]*\"\\(.*\\)\"[[:space:]]*$"
cell)
(not (string-match "[^\\]\"" (match-string 1 cell)))))
- (read cell))
+ (propertize (read cell) 'org-babel-value 'quoted-string))
(t (org-no-properties cell))))
(defun org-babel--string-to-number (string)
diff --git a/lisp/ob-shell.el b/lisp/ob-shell.el
index 35d9e9376..77c3fe261 100644
--- a/lisp/ob-shell.el
+++ b/lisp/ob-shell.el
@@ -300,6 +300,9 @@ (defun org-babel-sh-evaluate (session body &optional
params stdin cmdline)
of the statements in BODY, if RESULT-TYPE equals `value' then
return the value of the last statement in BODY."
(let* ((shebang (cdr (assq :shebang params)))
+ (cmdline-quote
+ (and cmdline
+ (get-text-property 0 'org-babel-value cmdline) "\""))
(async (org-babel-comint-use-async params))
(results-params (cdr (assq :result-params params)))
(value-is-exit-status
@@ -329,7 +332,9 @@ (defun org-babel-sh-evaluate (session body &optional
params stdin cmdline)
nil
(if shebang (when cmdline (list cmdline))
(list shell-command-switch
- (concat (file-local-name script-file)
" " cmdline)))))
+ (concat (file-local-name script-file)
+ " " cmdline-quote cmdline
+ cmdline-quote)))))
(buffer-string))))
(session ; session evaluation
(if async
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [BUG] ob-shell: internal representation of cmdline arguments the same
2024-05-01 12:11 ` Max Nikulin
@ 2024-05-01 14:02 ` Ihor Radchenko
0 siblings, 0 replies; 4+ messages in thread
From: Ihor Radchenko @ 2024-05-01 14:02 UTC (permalink / raw)
To: Max Nikulin; +Cc: emacs-orgmode
Max Nikulin <manikulin@gmail.com> writes:
> I consider it as a kind of pitfall inconsistent with DWIM concept. An
> idea of a kludge is below.
>
> #+begin_src sh :cmdline "1 2 3" :results verbatim
> printf '%s\n' "$@"
> #+end_src
> ...
> - (read cell))
> + (propertize (read cell) 'org-babel-value 'quoted-string))
> (t (org-no-properties cell))))
Well. See
https://list.orgmode.org/orgmode/87wmyc1sud.fsf@localhost/
>> Org cannot distinguish between
>>
>> #+begin_src lang :foo value with spaces
>> and
>> #+begin_src lang :foo "value with spaces"
>>
>> What we can do it make `org-babel-read' assign a text property to the
>> resulting string when it is a string with quotes:
>>
>> (org-babel-read "my file with quotes") ; => "my file with quotes"
>> (org-babel-read "\"my file with quotes\"") ; => #("my file with quotes" 0 19 (org-babel-quote t))
>>
>> Then, we can later use this information in `org-babel-merge-params'.
>> We will not call `split-string', when 'org-babel-quote text property is
>> present.
>> Also, `split-string' won't work when we have something like
>>
>> "yes \"my file with quotes\""
>>
>> Instead, we should use
>> (mapcar #'org-babel-read (org-babel-balanced-split "yes \"my file with quotes\"" ?\s))
--
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2024-05-01 14:01 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-04-28 13:27 [BUG] ob-shell: internal representation of cmdline arguments the same Matt
2024-04-29 12:22 ` Ihor Radchenko
2024-05-01 12:11 ` Max Nikulin
2024-05-01 14:02 ` Ihor Radchenko
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).