组织模式:将管道源代码块作为stdin输出到下一个源代码块


11

我尝试将一个源块的输出作为标准输入传递到下一个源块。这里是我到目前为止的一个例子:

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中(否则不需要大输出)

  • 结果必须手动命名

有解决方法或更好的方法吗?

Answers:


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

我有一个类似的用例,并且滚动了一个简单的导出器,该导出器使我可以将json-mode用于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

然后,添加(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
太好了,很高兴知道,谢谢。不幸的是,第二个源代码块实际上必须使用stdin。采用cat的外壳只是一个简单的例子。
theldoria

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.