Org-mode:stdinとしてソースブロックの出力を次のソースブロックにパイプします


11

1つのソースブロックの出力を標準入力として次のソースブロックにパイプ処理しようとしています。ここに私がこれまでに持っているものの例:

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

これに関する私の問題は:

  • を押して最初のブロックの結果を手動で作成する必要があります C-c C-c

  • 結果はorg-bufferに含める必要があります(それ以外の場合は大きな出力は必要ありません)

  • 結果には手動で名前を付ける必要があります

これを行うための回避策またはより良い方法はありますか?

回答:


10

結果の代わりにsrcブロックに名前を付けることでコードを修正する簡単な方法を次に示します。

#+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
とてもよかった、ありがとう、それは本当に役に立ちました。
theldoria

3

私は同様のユースケースを持っていて、stdinからのソース/入力にjson-modeを使用できるようにする単純なエクスポーターをロールバックしました:

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

次に、(passthrough . t)org-babel-list-langauges に追加すると、次のようになります。

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

「noweb」参照を使用して、別のsrcブロックを呼び出します(を参照(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
それはクールです、知っておくと良いです、ありがとう。残念ながら、2番目のソースコードブロックは実際にはstdinを使用する必要があります。catシェルでの使用は単純な例にすぎません。
theldoria 2016年

0

この問題を解決する別の方法は、入力が本当に静的である場合、入力にEXAMPLEまたはQUOTEブロックと名前を付けることです。このようなもの:

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

または、必要に応じて例:

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

次に、評価するコード内の名前付きブロックを参照します。ここでは、QUOTEの例を使用します。

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

some-jsonブロックの値は静的であるため、評価する必要はありません。the-codeブロックを評価すると、次のようになります。

#+RESULTS: the-code
: Hello json
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.