Kuruluş modu: sonraki kaynak bloğuna standart olarak boru kaynak bloğu çıkışı


11

Bir kaynak bloğunun çıkışını standart girdi olarak bir sonraki kaynak bloğuna geçirmeye çalışıyorum. İşte şimdiye kadar ne var bir örnek:

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

Bununla ilgili sorunlarım:

  • El ile ilk bloğun sonucunu vurarak oluşturmak zorundayım C-c C-c

  • sonuç org-buffer'a dahil edilmelidir (aksi takdirde büyük çıktıya gerek yoktur)

  • sonuç manuel olarak adlandırılmalıdır

Bunu yapmanın bir çözümü veya daha iyi bir yolu var mı?

Yanıtlar:


10

Sonuçlar yerine src bloğunu adlandırarak kodunuzu düzeltmenin basit bir yolu:

#+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
Çok iyi, teşekkürler, bu gerçekten yardımcı oldu.
16:40, theldoria

3

Benzer bir kullanım durumu vardı ve stdin kaynak / giriş için json-modunu kullanmama izin veren basit bir ihracatçı yuvarlandı:

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

Ardından, (passthrough . t)org-babel-list-langauges'a ekleyin ve işte burada:

#+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" referanslarını kullanarak başka bir src bloğunu çağırın (bkz. (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
Bu harika, bilmek güzel, teşekkürler. Ne yazık ki ikinci kaynak kodu bloğu gerçekten stdin kullanmak zorunda. Kullanımı catkabuğu sadece basit bir örneğidir.
Haziran'da theldoria

0

Bu sorunu çözmenin başka bir yolu, giriş gerçekten statikse girdiyi ÖRNEK veya QUOTE bloğu olarak adlandırmaktır. Bunun gibi bir şey:

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

veya isterseniz bir ÖRNEK:

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

daha sonra değerlendirmek istediğiniz kodda adlandırılan bloklara bakın; burada QUOTE örneğini kullanıyoruz:

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

Değeri yana some-jsonbloğu statik, bunu değerlendirmek için gerek yoktur. the-codeBlok değerlendirme :

#+RESULTS: the-code
: Hello json
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.