Org-Modus: Ausgabe des Pipe-Quellblocks als Standard zum nächsten Quellblock

11

Ich versuche, die Ausgabe eines Quellblocks als Standardeingabe an den nächsten Quellblock weiterzuleiten. Hier ein Beispiel für das, was ich bisher habe:

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

Meine Probleme damit sind:

  • Ich muss das Ergebnis des ersten Blocks manuell durch Drücken erstellen C-c C-c

  • Das Ergebnis muss im Organisationspuffer enthalten sein (große Ausgabe wird sonst nicht benötigt).

  • Das Ergebnis muss manuell benannt werden

Gibt es eine Problemumgehung oder einen besseren Weg, dies zu tun?

Theldoria
quelle

Antworten:

10

Hier ist eine einfache Möglichkeit, Ihren Code zu reparieren, indem Sie den src-Block anstelle der Ergebnisse benennen:

#+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
Emacs Benutzer
quelle
1
Sehr gut, danke, das hat wirklich geholfen.
Theldoria
3

Ich hatte einen ähnlichen Anwendungsfall und rollte einen einfachen Exporter, mit dem ich den json-Modus für die Quelle / Eingabe von stdin verwenden konnte:

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

Fügen Sie dann (passthrough . t)zu org-babel-list-langauges hinzu, und hier ist es in Aktion:

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

Rufen Sie einen src-Block von einem anderen mit "noweb" -Referenzen auf (siehe (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
quelle
1
Das ist cool, gut zu wissen, danke. Leider muss der zweite Quellcodeblock wirklich stdin verwenden. Die Verwendung catin der Shell war nur ein einfaches Beispiel.
Theldoria
0

Eine andere Möglichkeit, dieses Problem zu lösen, besteht darin, die Eingabe als BEISPIEL- oder QUOTE-Block zu benennen, wenn die Eingabe wirklich statisch ist. Etwas wie das:

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

oder ein BEISPIEL, wenn Sie bevorzugen:

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

Verweisen Sie dann auf die benannten Blöcke in dem Code, den Sie auswerten möchten. hier verwenden wir das QUOTE-Beispiel:

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

Da der Wert des some-jsonBlocks statisch ist, muss er nicht ausgewertet werden. Auswertungsblock the-codeergibt:

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