Modo Org: salida del bloque fuente de tubería como stdin al siguiente bloque fuente

11

Intento canalizar la salida de un bloque fuente al siguiente bloque fuente como entrada estándar. Aquí un ejemplo de lo que tengo hasta ahora:

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

Mis problemas con esto son:

  • Tengo que crear manualmente el resultado del primer bloque presionando C-c C-c

  • el resultado debe incluirse en org-buffer (de lo contrario, no se necesita una salida grande)

  • el resultado debe ser nombrado manualmente

¿Hay una solución alternativa o una mejor manera de hacer esto?

theldoria
fuente

Respuestas:

10

Aquí hay una manera simple de arreglar su código nombrando el bloque src en lugar de los resultados:

#+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
Usuario de Emacs
fuente
1
Muy bien, gracias, eso realmente ayudó.
theldoria
3

Tuve un caso de uso similar y lancé un exportador simple que me permitió usar json-mode para la fuente / entrada de 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

Luego, agregue (passthrough . t)a org-babel-list-langauges, y aquí está en acción:

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

Llame a un bloque src de otro usando referencias "noweb" (ver (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
fuente
1
Eso es genial, es bueno saberlo, gracias. Desafortunadamente, el segundo bloque de código fuente realmente tiene que usar stdin. El uso de caten el shell fue solo un simple ejemplo.
theldoria
0

Otra forma de resolver este problema es nombrar la entrada como un bloque EJEMPLO o CITA si la entrada es realmente estática. Algo como esto:

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

o un EJEMPLO si lo prefiere:

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

luego haga referencia a esos bloques nombrados en el código que desea evaluar; Aquí usamos el ejemplo de CITA:

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

Como el valor del some-jsonbloque es estático, no hay necesidad de evaluarlo. La evaluación del the-codebloque da:

#+RESULTS: the-code
: Hello json
jeffmcc
fuente