我最近一直在使用 egrep 命令(只是出于对 grep 的偏好),我注意到一种我不完全理解的行为。当我在我的主目录中运行以下命令时:
egrep -r "main" *
它会执行我期望的操作并返回所有包含“main”的行和相应的文件。
虽然如果我输入:
egrep -r "main"
并且忘记把星星放在最后,它似乎只是永远挂着。我希望有人能够阐明为什么会这样以及它在做什么?
谢谢 :)
它正在等待stdin
来自手册页的输入,因为您没有指定文件名grep
:
NAME
grep, egrep, fgrep - print lines matching a pattern
SYNOPSIS
grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN | -f FILE] [FILE...]
DESCRIPTION
Grep searches the named input FILEs (or standard input if no files
are named, or the file name - is given) for lines containing a
match to the given PATTERN. By default, grep prints the matching lines.
grep(或 egrep)需要知道要搜索的文件。通过包含*
,您是在告诉它搜索当前目录中的所有文件。
如果您不包含*
,它不知道在哪里查找,因此它会等待您的输入,并会提示您输入进行搜索(输入,然后按 ctrl+d 终止标准输入模式)。
这种行为并不是 grep 独有的。任何需要输入的命令都希望输入来自文件或标准输入 (stdin)。
标准输入数据可以来自管道,也可以在输入命令后在提示符下手动输入(当您认为它已挂起时,您会看到)。正如我所提到的,按 Ctrl+D 将使您退出该输入模式。
您没有提供路径,因此 grep 等待stdin
数据。
路径示例:
egrep -r "pattern" .
<- 在当前目录和子目录中搜索
cat file | egrep "pattern"
<- 从管道中搜索数据