संगठन-मोड: अगले स्रोत ब्लॉक के लिए स्टड के रूप में पाइप स्रोत ब्लॉक आउटपुट


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-बफर (बड़े उत्पादन अन्यथा आवश्यक नहीं) में शामिल होना चाहिए

  • परिणाम मैन्युअल रूप से नामित किया जाना चाहिए

क्या ऐसा करने के लिए वर्कअराउंड या बेहतर तरीका है?

जवाबों:


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
बहुत अच्छा, धन्यवाद, कि वास्तव में मदद की।
द ओल्डोरिया

3

मेरे पास एक समान उपयोग का मामला था, और एक साधारण निर्यातक को रोल किया, जो मुझे स्टड से स्रोत / इनपुट के लिए 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" संदर्भ (देखें (info "(org) Noweb reference syntax")) का उपयोग करके किसी अन्य से एक src ब्लॉक को कॉल करें :

#+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
यह अच्छा है, पता करने के लिए अच्छा है, धन्यवाद। दुर्भाग्य से दूसरा स्रोत कोड ब्लॉक वास्तव में स्टड का उपयोग करना है। catशेल में उपयोग केवल एक सरल उदाहरण था।
द ओल्डोरिया

0

इस समस्या को हल करने का दूसरा तरीका इनपुट को एक उदाहरण या एक उद्धरण के रूप में नामित करना है यदि इनपुट वास्तव में स्थिर है। कुछ इस तरह:

#+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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.