Де пошук за замовчуванням здійснює 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.
манастирська робота

2
Ага. Я перевірив grep2.12: pastebin.com/L4my26QS Тим часом я виявив це у файлі NEWS щодо версії 2.11 (2012-03-02): "Якщо операнд файлу не заданий, надається командний рядок -r або еквівалентний варіант , grep тепер шукає робочий каталог. Раніше grep ігнорував -r та шукав стандартний вхід нерекурсивно. Ан -r, знайдений у GREP_OPTIONS, не має цього нового ефекту. "
манастирська робота

3
GNU grep нещодавно змінив поведінку з аргументом -r (див . Команду ). Тож "grep -r PATTERN" з новим grep буде шукати поточний каталог, а не STDIN.
хлук

2
@Mikel, я оновив своє запитання греп-версією. Здається, відповідь, яку я вказав як правильну, справді є правильною, тому що я використовую "стару" греп. Отже, не важливо, вказати -r чи ні, якщо каталог не надано, він шукає в STDIN. Btw, спасибі за це розслідування, тепер я буду в курсі майбутніх змін у grep;)

Відповіді:


24

Насправді він ніде не шукає. Він чекає на введення зі стандартного вводу.

Спробуйте це:

beast:~ viroos$ grep foo

коли ви введете рядок, що містить "foo", і натисніть клавішу введення, цей рядок буде повторений, інакше курсор буде переведений на новий рядок, але grep нічого не надрукує.


6
Як я коментував вище, grep -r PATTERNз новою версією GNU grep не буде читати стандартне введення, а шукати шаблон у поточному каталозі (див . Фіксацію ). Ця зміна має сенс, оскільки ви, мабуть, не хочете шукати стандартні дані, коли вказуєте -rпрапор.
hluk

Я перевірив свою греп-версію, вона становить 2,10, тому ця відповідь цілком актуальна. Btw, тепер я буду знати, що чекати від новіших версій grep.

3

Саме так, як сказано в попередній відповіді Масьєка:

Насправді він ніде не шукає. Він чекає на введення зі стандартного вводу.

Однак ви можете записатись у stdin вже запущеної програми, якщо у вас є / proc доступним, проклавши дані до цього першого дескриптора:

В одному термінальному циклі

grep "hello"

і побачимо, як воно чекає нескінченно ... В іншому терміналі це:

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

дивіться перше привіт друк на терміналі та ваше ім'я користувача.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.