Modo organizacional: saída do bloco de origem do tubo como stdin para o próximo bloco de origem

11

Tento canalizar a saída de um bloco de origem para o próximo bloco de origem como entrada padrão. Aqui está um exemplo do que tenho até agora:

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

Meus problemas com isso são:

  • Eu tenho que criar manualmente o resultado do primeiro bloco pressionando C-c C-c

  • o resultado deve ser incluído no buffer organizacional (não é necessária uma saída grande)

  • o resultado deve ser nomeado manualmente

Existe uma maneira alternativa ou melhor de fazer isso?

theldoria
fonte

Respostas:

10

Aqui está uma maneira simples de corrigir seu código nomeando o bloco src em vez de resultados:

#+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
Usuário Emacs
fonte
1
Muito bom, obrigado, isso realmente ajudou.
Theldoria
3

Eu tive um caso de uso semelhante e rolei um exportador simples que me permitiu usar o modo json para a fonte / entrada do 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

Em seguida, adicione (passthrough . t)org-babel-list-langauges e aqui está em ação:

#+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
Matt Curtis
fonte
2

Chame um bloco src de outro usando as referências "noweb" (consulte (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
mutbuerger
fonte
1
Isso é legal, é bom saber, obrigado. Infelizmente, o segundo bloco de código-fonte realmente precisa usar stdin. O uso de catno shell foi apenas um exemplo simples.
Theldoria
0

Outra maneira de resolver esse problema é nomear a entrada como um bloco EXAMPLE ou QUOTE se a entrada for realmente estática. Algo assim:

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

ou um EXEMPLO, se você preferir:

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

faça referência aos blocos nomeados no código que você deseja avaliar; aqui usamos o exemplo QUOTE:

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

Como o valor do some-jsonbloco é estático, não há necessidade de avaliá-lo. O the-codebloco de avaliação fornece:

#+RESULTS: the-code
: Hello json
jeffmcc
fonte