Action
1
假设这样一段代码
#+name: src_file
#+BEGIN_SRC shell :results output
ls / | head -n 3
#+END_SRC
#+RESULTS:
: bin
: boot
: cdrom
调用src_file
#+BEGIN_SRC shell :results output :var fp=src_file
echo "$fp"
#+END_SRC
#+RESULTS:
: bin
: boot
: cdrom
:
这里src_file捕获的是代码的输出, 是输出结果的变量名, 而非这段代码的文件名.
怎样实现这样的效果
#+BEGIN_SRC shell :results output :var fp=src_file
bash "$fp"
#+END_SRC
#+RESULTS:
: bin
: boot
: cdrom
第一个代码块可以不执行,打上 :noeval
标记,直接在第二个代码块上 C-c C-c
:
方法1: 嵌入代码块
#+name: src_block
#+BEGIN_SRC shell :noeval
ls / | head -n 3
#+END_SRC
#+BEGIN_SRC shell :results output :noweb yes
<<src_block>>
#+END_SRC
#+RESULTS:
: Applications
: Library
: Network
方法2: tangle
#+NAME: src_file
#+BEGIN_SRC shell :tangle /tmp/test-ob-sh-tangle.sh :noeval
ls / | head -n 3
#+END_SRC
#+BEGIN_SRC shell :results output :var src_file=(progn (org-babel-goto-named-src-block "src_file") (org-babel-tangle '(4)))
bash $src_file
#+END_SRC
#+RESULTS:
: Applications
: Library
: Network
EDIT: 根据楼下 @xuchunyang 的建议修改了方法二,通过 :var
变量得到文件名。
6 个赞
方法二中,:var
应该又可以获得 tangle 得到的文件名,这样应该更接近 OP 的要求。而且应该还可封装成一个函数,方便使用。
1 个赞