Modalità Org: output del blocco sorgente pipe come stdin al blocco sorgente successivo


11

Provo a reindirizzare l'output di un blocco sorgente al successivo blocco sorgente come input standard. Ecco un esempio di ciò che ho finora:

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

I miei problemi con questo sono:

  • Devo creare manualmente il risultato del primo blocco colpendo C-c C-c

  • il risultato deve essere incluso in org-buffer (altrimenti non è necessario un grande output)

  • il risultato deve essere nominato manualmente

Esiste una soluzione alternativa o un modo migliore per farlo?

Risposte:


10

Ecco un modo semplice per correggere il codice nominando il blocco src anziché i risultati:

#+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
Molto bene, grazie, mi ha davvero aiutato.
theldoria,

3

Ho avuto un caso d'uso simile e ho lanciato un semplice esportatore che mi ha permesso di utilizzare la modalità json per l'origine / l'input da 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

Quindi, aggiungi (passthrough . t)a org-babel-list-langauges, ed eccolo in azione:

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

Chiama un blocco src da un altro usando i riferimenti "noweb" (vedi (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
È bello, buono a sapersi, grazie. Sfortunatamente il secondo blocco di codice sorgente deve davvero usare stdin. L'uso di catnella shell era solo un semplice esempio.
theldoria,

0

Un altro modo per risolvere questo problema è nominare l'input come un ESEMPIO o un blocco QUOTE se l'input è veramente statico. Qualcosa come questo:

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

o un ESEMPIO se si preferisce:

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

quindi fai riferimento a quei blocchi con nome nel codice che desideri valutare; qui usiamo l'esempio QUOTE:

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

Poiché il valore del some-jsonblocco è statico, non è necessario valutarlo. Il the-codeblocco di valutazione fornisce:

#+RESULTS: the-code
: Hello json
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.