![如何运行长时间运行的 grep,将结果通过管道传输到 less 并将所有内容放入后台?](https://linux22.com/image/5910/%E5%A6%82%E4%BD%95%E8%BF%90%E8%A1%8C%E9%95%BF%E6%97%B6%E9%97%B4%E8%BF%90%E8%A1%8C%E7%9A%84%20grep%EF%BC%8C%E5%B0%86%E7%BB%93%E6%9E%9C%E9%80%9A%E8%BF%87%E7%AE%A1%E9%81%93%E4%BC%A0%E8%BE%93%E5%88%B0%20less%20%E5%B9%B6%E5%B0%86%E6%89%80%E6%9C%89%E5%86%85%E5%AE%B9%E6%94%BE%E5%85%A5%E5%90%8E%E5%8F%B0%EF%BC%9F.png)
我经常发现自己需要找到给定符号的代码库,如下所示:
find src/galio -not -path './src/stapi-sdk/apilib/* -regextype posix-extended -iregex '.*(\.hpp|\.hxx|\.cpp|\.cxx|\.h|\.c|\.ma?k|\.sh|makefile)' | xargs egrep --colour=always -Hn 'NUM_EXTERITY_FLAGS' | less -R
find
/组合grep
可能需要相当长的时间,我想将整个链放入后台(使用Ctrl-Z和bg
)并稍后再回来查看结果。
然而,在将整个作业放入后台后,整个作业立即再次“停止” bg
。有没有解决的办法?
谢谢
答案1
screen
对于这种情况我会推荐。 (或者如果您可行的话,可以在不同的窗口中运行该命令。)
要启动分离会话,只需输入screen
。然后键入您的命令,但不将&
其设置为背景。使用Ctrlathend分离正在运行的会话。用于screen -ls
列出现有会话并screen -r
重新连接。
答案2
减少搜索速度的两个问题是管道等待和打开标准输出/错误以进行读取。在正常操作中,less 会读到足够填满整个屏幕的内容,然后停止阅读,直到进入下一页。这工作得很好,除非您正在从管道中读取数据,并且写入管道的程序注意到管道 ID 已满并休眠,直到管道被读取并且写入速度足以填充下一页时速度非常慢。减少此行为的两种最简单的方法是搜索不存在的内容或计算标准输入的大小。两者都会读入完整的文件。下一个问题是,要控制 less,它需要从键盘接收命令,因此它会打开标准输出或标准错误进行读取。这很奇怪,但工作得很好(有一些 less 负责的保护措施),但现在 less 有一个打开的文件句柄用于读取,该句柄指向控制 tty(控制 less 时需要的),当您将事物置于后台,当 less 尝试读取某个键时,shell 会将其置于睡眠状态。您可以通过在将文件放入后台之前在 less 中搜索文件末尾来解决此问题。