Tryb Org: wyjście bloku źródłowego potoku jako standardowe wejście do następnego bloku źródłowego

11

Próbuję przesłać dane wyjściowe z jednego bloku źródłowego do następnego bloku źródłowego jako standardowe wejście. Oto przykład tego, co mam do tej pory:

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

Moje problemy z tym są następujące:

  • Muszę ręcznie utworzyć wynik pierwszego bloku, naciskając C-c C-c

  • wynik musi być zawarty w buforze org (w przeciwnym razie duże wyjście nie jest potrzebne)

  • wynik należy nazwać ręcznie

Czy istnieje obejście lub lepszy sposób na zrobienie tego?

theldoria
źródło

Odpowiedzi:

10

Oto prosty sposób, aby naprawić kod, nazywając blok src zamiast wyników:

#+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
Użytkownik Emacsa
źródło
1
Bardzo dobrze, dzięki, to naprawdę pomogło.
theldoria
3

Miałem podobny przypadek użycia i uruchomiłem prosty eksporter, który pozwala mi używać trybu json dla źródła / wejścia ze standardowego wejścia:

;;; 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

Następnie dodaj (passthrough . t)do org-babel-list-langauges i oto jest w akcji:

#+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
Matt Curtis
źródło
2

Wywołaj blok src z innego, używając referencji „noweb” (patrz (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
źródło
1
To jest fajne, dobrze wiedzieć, dzięki. Niestety drugi blok kodu źródłowego naprawdę musi używać standardowego wejścia. Zastosowanie catw powłoce było tylko prostym przykładem.
theldoria
0

Innym sposobem rozwiązania tego problemu jest nazwanie wejścia jako PRZYKŁAD lub blok QUOTE, jeśli dane wejściowe są naprawdę statyczne. Coś takiego:

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

lub PRZYKŁAD, jeśli wolisz:

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

następnie odwołaj się do nazwanych bloków w kodzie, który chcesz ocenić; tutaj używamy przykładu QUOTE:

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

Ponieważ wartość some-jsonbloku jest statyczna, nie ma potrzeby jej oceny. the-codeBlok oceniający daje:

#+RESULTS: the-code
: Hello json
jeffmcc
źródło