Babel src在buffer中, 如何能将src代码片段作为一个命名文件来用

假设这样一段代码

#+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 个赞