Org-mode: đầu ra khối nguồn ống là stdin cho khối nguồn tiếp theo


11

Tôi cố gắng chuyển đầu ra của một khối nguồn sang khối nguồn tiếp theo làm đầu vào tiêu chuẩn. Đây là một ví dụ về những gì tôi có cho đến nay:

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

Vấn đề của tôi với điều này là:

  • Tôi phải tự tạo kết quả của khối đầu tiên bằng cách nhấn C-c C-c

  • kết quả phải được đưa vào bộ đệm org (không cần đầu ra lớn)

  • kết quả phải được đặt tên thủ công

Có một cách giải quyết hoặc cách tốt hơn để làm điều này?

Câu trả lời:


10

Đây là một cách đơn giản để sửa mã của bạn bằng cách đặt tên khối src thay vì kết quả:

#+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
Rất tốt, cảm ơn, điều đó thực sự có ích.
theldoria

3

Tôi đã có một trường hợp sử dụng tương tự, và cuộn một trình xuất đơn giản cho phép tôi sử dụng chế độ json cho nguồn / đầu vào từ 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

Sau đó, thêm (passthrough . t)vào org-babel-list-langauges, và đây là hành động:

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

Gọi một khối src từ một khối khác bằng cách sử dụng các tham chiếu "noweb" (xem (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
Đó là mát mẻ, tốt để biết, cảm ơn. Thật không may, khối mã nguồn thứ hai thực sự phải sử dụng stdin. Việc sử dụng cattrong shell chỉ là một ví dụ đơn giản.
theldoria

0

Một cách khác để giải quyết vấn đề này là đặt tên đầu vào là một VÍ DỤ hoặc khối QUOTE nếu đầu vào thực sự tĩnh. Một cái gì đó như thế này:

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

hoặc một VÍ DỤ nếu bạn thích:

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

sau đó tham chiếu các khối được đặt tên trong mã bạn muốn đánh giá; ở đây chúng tôi sử dụng ví dụ QUOTE:

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

Vì giá trị của some-jsonkhối là tĩnh, nên không cần phải đánh giá nó. Đánh giá the-codekhối cho:

#+RESULTS: the-code
: Hello json
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.