Org-mode: вывод исходного блока канала как стандартный вывод в следующий исходный блок

11

Я пытаюсь передать вывод одного исходного блока следующему исходному блоку как стандартный ввод. Вот пример того, что у меня так далеко:

Create stdin data:
#+header: :exports code
#+header: :results output
#+begin_src sh
echo "That goes to the next"
#+end_src

#+name: piped
#+RESULTS:
: That goes to the next 

Use "piped" as stdin:
#+header: :exports results
#+header: :stdin piped
#+header: :results output
#+begin_src sh
VALUE=$(cat)
echo "I got:"
echo "$VALUE"
#+end_src

Мои проблемы с этим:

  • Я должен вручную создать результат первого блока, нажав C-c C-c

  • результат должен быть включен в org-буфер (в противном случае большой вывод не требуется)

  • результат должен быть назван вручную

Есть ли обходной путь или лучший способ сделать это?

theldoria
источник

Ответы:

10

Вот простой способ исправить ваш код, назвав блок src вместо результатов:

#+name: piped
#+header: :exports code
#+header: :results output
#+begin_src sh
echo "That goes to the next"
#+end_src

#+RESULTS:
: That goes to the next 

#+header: :exports results
#+header: :stdin piped
#+header: :results output
#+begin_src sh
VALUE=$(cat)
echo "I got:"
echo "$VALUE"
#+end_src

#+results:
: I got:
: That goes to the next
Пользователь Emacs
источник
1
Очень хорошо, спасибо, это действительно помогло.
Телдория
3

У меня был похожий вариант использования, и я выбрал простой экспортер, который позволил мне использовать json-mode для ввода / вывода из stdin:

;;; ob-passthrough.el ---  passthrough evaluator          -*- lexical-binding: t; -*-

;; this ob evaluates the block as ifself, so it can be used as input
;; for another block

(require 'ob)

(defun org-babel-execute:passthrough (body params)
  body)

;; json output is json
(defalias 'org-babel-execute:json 'org-babel-execute:passthrough)

(provide 'ob-passthrough)
;;; ob-passthrough.el ends here

Затем добавьте (passthrough . t)в org-babel-list-langauges, и вот оно в действии:

#+NAME: json-test
#+BEGIN_SRC json
  {"greet": "hello, world"}
#+END_SRC

#+HEADER: :stdin json-test
#+BEGIN_SRC sh
  jq .greet
#+END_SRC

#+RESULTS:
: hello, world
Мэтт Кертис
источник
2

Вызовите блок src из другого источника, используя ссылки "noweb" (см. (info "(org) Noweb reference syntax")):

#+name: input
#+header: :exports code
#+header: :results output
#+begin_src sh
echo "That goes to the next"
#+end_src

#+header: :exports results
#+header: :results output :noweb no-export
#+begin_src sh
VALUE=$(<<input>>)
echo "I got:"
echo "$VALUE"
#+end_src

#+results:
: I got:
: That goes to the next
mutbuerger
источник
1
Это круто, приятно знать, спасибо. К сожалению, второй блок исходного кода действительно должен использовать stdin. Использование catв оболочке было только простым примером.
Телдория
0

Другим способом решения этой проблемы является присвоение имени входу блока EXAMPLE или QUOTE, если вход действительно статический. Что-то вроде этого:

#+NAME: some-json
#+BEGIN_QUOTE
{"label": "Hello json"}
#+END_QUOTE

или ПРИМЕР, если вы предпочитаете:

#+NAME: some-json-2
#+BEGIN_EXAMPLE
{"label": "ehlo json"}
#+END_EXAMPLE

затем ссылаться на эти именованные блоки в коде, который вы хотите оценить; здесь мы используем пример QUOTE:

#+NAME: the-code
#+HEADER: :stdin some-json
#+BEGIN_SRC shell
jq .label
#+END_SRC

Поскольку значение some-jsonблока является статическим, нет необходимости оценивать его. Оценочный the-codeблок дает:

#+RESULTS: the-code
: Hello json
jeffmcc
источник