Org 모드 : 다음 소스 블록에 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에 포함되어야합니다 (큰 출력은 필요하지 않습니다)

  • 결과는 수동으로 이름을 지정해야합니다

해결 방법이나 더 좋은 방법이 있습니까?

답변:


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 모드를 사용할 수있는 간단한 내보내기를 굴 렸습니다.

;;; 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.