emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* [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).