Org-mode: sortie du bloc source en tant que stdin vers le bloc source suivant


11

J'essaie de diriger la sortie d'un bloc source vers le bloc source suivant en tant qu'entrée standard. Voici un exemple de ce que j'ai jusqu'à présent:

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

Mes problèmes avec ceci sont:

  • Je dois créer manuellement le résultat du premier bloc en appuyant sur C-c C-c

  • le résultat doit être inclus dans org-buffer (une sortie importante n'est pas nécessaire sinon)

  • le résultat doit être nommé manuellement

Existe-t-il une solution de contournement ou une meilleure façon de procéder?

Réponses:


10

Voici un moyen simple de corriger votre code en nommant le bloc src au lieu des résultats:

#+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
Très bien, merci, cela a vraiment aidé.
theldoria

3

J'ai eu un cas d'utilisation similaire et j'ai lancé un simple exportateur qui m'a permis d'utiliser le mode json pour la source / entrée 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

Ensuite, ajoutez (passthrough . t)à org-babel-list-langauges, et le voici en action:

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

Appelez un bloc src à partir d'un autre en utilisant des références "noweb" (voir (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
C'est cool, bon à savoir, merci. Malheureusement, le deuxième bloc de code source doit vraiment utiliser stdin. L'utilisation de catdans le shell n'était qu'un exemple simple.
theldoria

0

Une autre façon de résoudre ce problème consiste à nommer l'entrée en tant qu'EXEMPLE ou bloc QUOTE si l'entrée est vraiment statique. Quelque chose comme ça:

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

ou un EXEMPLE si vous préférez:

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

référencez ensuite les blocs nommés dans le code que vous souhaitez évaluer; nous utilisons ici l'exemple QUOTE:

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

La valeur du some-jsonbloc étant statique, il n'est pas nécessaire de l'évaluer. Le the-codebloc d' évaluation donne:

#+RESULTS: the-code
: Hello json
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.