【问题标题】:Capturing the output of "diff" with org-babel使用 org-babel 捕获“diff”的输出
【发布时间】:2026-01-15 11:15:02
【问题描述】:

我正在尝试使用 org-babel 捕获 diff 的输出,但由于某种原因它无法正常工作。对于文件

1

a b c

2

a c b

从命令行调用的diff 1 2返回

1c1
< a b c
---
> a c b

但是使用 org-babel,什么都没有:

#+begin_src sh                                                                                                                                                 
diff 1 2                                                                                                                                                       
#+end_src                                                                                                                                                      

#+RESULTS:

迷你缓冲区读取“代码块未产生输出”。 org-babel 错误输出窗口为空。 ls 等其他命令按预期显示输出。我对 org-babel 不熟悉。

我尝试使用:results output verbatim,没有任何变化。我还尝试按照建议的here 使用:results output replace。没有帮助。

  • Emacs 版本是 24.4.1(在 Debian jessie 上)
  • 组织模式版本为 8.2.10

【问题讨论】:

  • 当 diff 发现两个文件不同时,它返回一个非零的退出代码。 org-babel 似乎假设如果一个块返回非零退出代码,则执行失败并且 org-babel 阻塞。

标签: emacs sh org-mode org-babel


【解决方案1】:

我可以重现您的问题(在 OSX 上)。

奇怪的是,执行 babel 块会打开 Org-babel 错误输出 缓冲区,好像有什么东西要去 STDERR。

如果在 diff 之后添加任何其他输出,结果将显示 OK。例如,

#+begin_src sh :results output
diff 1 2
echo
#+end_src

如果你强制 diff 的结果到标准输出,结果也会显示:

#+begin_src sh :results output
diff 1 2 | cat
#+end_src

【讨论】:

  • @Alex 你提交过那个错误吗?如果是这样,我会添加一个补丁 - 如果不是,我会提交我自己的补丁。
  • @AaronMiller 我不记得了。我建议你添加自己的。
  • @AaronMiller:这个问题发生了什么?我刚刚遇到了同样的问题,并且适用相同的解决方法。
  • @MeaningfulUsername 从来没有机会跟进。
  • 3 年了,bug 仍然存在。
【解决方案2】:

当返回码不是0 时,看起来org-babel 不喜欢它。这就是各种解决方案起作用的原因。添加另一个命令使用意味着该块的整体错误代码是成功的。类似地,管道进入cat 使管道返回cat 的错误代码。另一种处理错误条件的方法是:

  diff 1 2 || true

【讨论】: