Org-режим: вихідний блок джерела труби як stdin до наступного блоку джерела


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-буфер (великий вихід не потрібен інакше)

  • результат повинен бути названий вручну

Чи є спосіб вирішення чи кращий спосіб зробити це?

Відповіді:


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

1
Дуже добре, дякую, що справді допомогло.
theldoria

3

У мене був подібний випадок використання, і прокрутив простий експортер, який дозволив мені використовувати json-режим для джерела / вводу з 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, і ось він діє:

#+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

1
Це круто, добре знати, дякую. На жаль, другий блок вихідного коду дійсно повинен використовувати stdin. Використання catоболонки було лише простим прикладом.
theldoria

0

Інший спосіб вирішити цю проблему - назвати вхід як ПРИКЛАД або БІЛЬКИЙ блок, якщо вхід справді статичний. Щось на зразок цього:

#+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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.