今天我在 emacs shell 中运行了这样的命令:
./someBinary | grep foo | cut -c30- | sort | uniq -c
这在 bash 中需要一点但不会那么长(大约 15 秒),因为输出很容易超过一百万行。但是,当我在 emacs shell 中运行此命令时,我等了一个多小时,它仍在运行,如果我检查top
. 我想知道这是否是因为 emacs 实现了我在 lisp 中使用的 unix 工具——如果这是原因,是否有办法让它默认为系统工具。
Emacs 正在捕获 shell 缓冲区中的最终输出,并应用字体锁定和其他分析(例如行号计数)来显示它。它还滚动显示以显示最新的输出。虽然 Emacs 提供了剔除病态长命令输出的规定,但它并没有真正针对数百万行的真正大量输出进行优化,因此它的性能明显比终端仿真器差,从而减慢了整个管道。
如果您对输出不感兴趣,请将其重定向到/dev/null
或tail -500
,这就是您在典型的终端回滚中看到的内容。
不,emacs 没有实现这些工具。即运行您从命令行运行的相同工具。但是,输出正在通过各种管道传递,并且可能具有 emacs 应用的各种格式,这很可能是极端减速的罪魁祸首。一件容易尝试的事情是在 shell 缓冲区中禁用字体锁定模式。
你没有说你是否使用eshell
或shell
。以我的经验,shell
工作得很好,但eshell
对于任何想要通过管道放置 >1k 行的东西来说完全无法使用(这很可悲,因为 eshell 的其他功能看起来很不错)。
请注意,即使输出只是一行,eshell 也会很慢,只要您使用 a |
,因此它似乎是实际的|
运算符(在 eshell 中的 emacs-lisp 中实现)很慢。