Где grep -r ищет по умолчанию?

16

Я обнаружил, что если я ищу с использованием grep без указания пути, то grep -r 'mytext'это занимает бесконечно много времени. Между тем, если я ищу по указанному пути, grep -r 'mytext' .он сразу находит то, что мне нужно. Итак, мне любопытно, в первом виде, в каком каталоге выполняет поиск grep?

UDATE: версия grep: grep (GNU grep) 2.10


источник
3
Попробуйте набрать, напишите foomytextbar(после Enter) после запуска grep -r 'mytext'.
sr_
2
Может быть, вы должны указать, что это за король grep. В GNU grepя использую Linux grep -r 'mytext'и делаю grep -r 'mytext' .то же самое: рекурсивный поиск, начиная с текущего каталога. При использовании -rпереключателя GNU grep не ищет STDIN.
manatwork
2
Ах. Я тестировал с grep2.12: pastebin.com/L4my26QS Тем временем я нашел это в файле NEWS относительно версии 2.11 (2012-03-02): «Если не указан файловый операнд и задана опция командной строки -r или эквивалентная ей» , grep теперь ищет в рабочем каталоге. Ранее grep игнорировал -r и искал стандартный ввод нерекурсивно. -r, найденный в GREP_OPTIONS, не имеет этого нового эффекта. "
manatwork
3
GNU grep недавно изменил поведение с аргументом -r (см. Фиксацию ). Так что "grep -r PATTERN" с более новым grep будет искать текущий каталог, а не STDIN.
Глюк
2
@Mikel, я обновил свой вопрос версией grep. Кажется, что ответ, который я указал как правильный, действительно правильный, потому что я использую «старый» grep. Поэтому не имеет значения, указывать -r или нет, если каталог не указан, он выполняет поиск в STDIN. Кстати, спасибо за это исследование, теперь я буду знать о будущих изменениях в grep;)

Ответы:

24

На самом деле он нигде не ищет. Он ожидает ввода от стандартного ввода.

Попробуй это:

beast:~ viroos$ grep foo

когда вы набираете строку, содержащую «foo», и нажимаете ввод, эта строка будет повторяться, в противном случае курсор будет перемещен на новую строку, но grep ничего не печатает.

Maciek Sawicki
источник
6
Как я прокомментировал выше grep -r PATTERNс более новой версией GNU, grep не будет читать стандартный ввод, а будет искать шаблон в текущем каталоге (см. Фиксацию ). Это изменение имеет смысл, так как вы, вероятно, не хотите искать стандартный ввод, когда вы указываете -rфлаг.
Глюк
Я проверил свою версию grep, это 2.10, так что этот ответ совершенно актуален. Кстати, теперь я буду знать, чего ждать от новых версий grep.
3

Точно так же, как предыдущий ответ Maciek говорит:

На самом деле он нигде не ищет. Он ожидает ввода от стандартного ввода.

Однако вы можете записать в stdin уже запущенной программы, если у вас есть / proc, передавая данные в его 0-й первый дескриптор:

В одном терминале запустить

grep "hello"

и увидим, что он ждет бесконечно ... В другом терминале введите:

echo "hello $USER" > /proc/`pgrep grep`/fd/0

увидеть первый терминал печати привет и ваше имя пользователя.

Philluminati
источник