Org-mode: output blok sumber pipa sebagai stdin ke blok sumber berikutnya


11

Saya mencoba menyalurkan output dari satu blok sumber ke blok sumber berikutnya sebagai input standar. Berikut ini contoh dari apa yang saya miliki sejauh ini:

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

Masalah saya dengan ini adalah:

  • Saya harus secara manual membuat hasil dari blok pertama dengan menekan C-c C-c

  • hasilnya harus dimasukkan dalam org-buffer (output besar tidak diperlukan jika tidak)

  • hasilnya harus dinamai secara manual

Apakah ada solusi atau cara yang lebih baik untuk melakukan ini?

Jawaban:


10

Berikut ini cara sederhana untuk memperbaiki kode Anda dengan memberi nama blok src alih-alih hasil:

#+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
Sangat bagus, terima kasih, itu sangat membantu.
theldoria

3

Saya memiliki kasus penggunaan yang serupa, dan menggulung eksportir sederhana yang memungkinkan saya menggunakan mode json untuk sumber / input dari 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

Kemudian, tambahkan (passthrough . t)ke org-babel-list-langauges, dan ini dia sedang beraksi:

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

Panggil blok src dari yang lain menggunakan referensi "noweb" (lihat (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
Itu keren, senang tahu, terima kasih. Sayangnya blok kode sumber kedua benar-benar harus menggunakan stdin. Penggunaan catdalam shell hanyalah contoh sederhana.
theldoria

0

Cara lain untuk mengatasi masalah ini adalah dengan memberi nama input sebagai CONTOH atau blok QUOTE jika input benar-benar statis. Sesuatu seperti ini:

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

atau CONTOH jika Anda lebih suka:

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

kemudian referensi blok-blok yang disebutkan dalam kode yang ingin Anda evaluasi; di sini kita menggunakan contoh QUOTE:

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

Karena nilai some-jsonblok bersifat statis, tidak perlu untuk mengevaluasinya. Mengevaluasi the-codeblok memberi:

#+RESULTS: the-code
: Hello json
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.