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