当我在单个文件中搜索时,返回不显示行号

Ack dooesn't show the line number when i search in the single file

示例)当我在 proc.c 文件中搜索 exec 时,

$ ack allocproc proc.c

allocproc(void)
p = allocproc();
if((np = allocproc()) == 0){
// Return to "caller", actually trapret (see allocproc).

但是当我搜索整个目录时,

$ ack allocproc

---- blah blah blah ----

proc.c
36:allocproc(void)
84:  p = allocproc();
139:  if((np = allocproc()) == 0){
357:  // Return to "caller", actually trapret (see allocproc).

...我想在单个文件中搜索字符串时显示行...

也许在 .bashrc 中添加一行 alias ackl='ack -H'

并默认使用 ackl 命令...将暂时解决此问题。

ack中的-H标志将强制ack在每个文件上放置一个文件header和行号。此行为直接从 GNU grep 复制而来。

您指出了创建 shell 别名的选项。另一种选择是将 -H 放在 ackrc 文件中。 ack 支持在三个不同的地方查找 ackrc。在 /etc/ackrc 中有一个 system-wide,在您的 ~/.ackrc 文件中有一个是您个人的,您还可以有一个 project-specific 文件,通常在项目的根目录中。

有关 ackrc 文件的更多信息,请查看 ack 手册(ack --man 是一种查看方式)并查找 "THE .ackrc FILE" 和 "ACKRC LOCATION SEMANTICS".[=15= 部分]

-H 放在 .ackrc 中的一个缺点是,无论您如何调用 ack,它都将始终有效,因此,例如,如果您通过 ack 传输来自一个进程的输出, ack 仍会显示标题和行号。

另一种处理方法:只需在需要时添加 -H 选项即可。

我发现,在 grepack 中,如果它们对一个文件的行为与对多个文件的行为不同, 您可以通过将 /dev/null 作为第二个文件进行搜索来强制执行多文件行为。

当然,使用 -H 开关要干净得多(并且具有被列在文档中的优势,以便好奇的维护者可以看到其使用背后的确切目的),但是如果您在紧要关头并且没有可用的文档(或者如果您正在使用其他一些程序,这些程序对一个文件和多个文件的行为不同),那么使用 /dev/null 可能会起作用。

我不建议在脚本中调用的命令中使用这种 /dev/null 技术——在这种情况下,-H 开关是首选方法,除非出于某种原因 -H你真的无法使用。