Wo sucht grep -r standardmäßig?

16

Ich fand, wenn ich mit grep suche, ohne einen Pfad anzugeben, wie grep -r 'mytext'es unendlich lange dauert. Wenn ich mit dem angegebenen Pfad suche, grep -r 'mytext' .findet es in der Zwischenzeit sofort das, was ich brauche. Ich bin also gespannt, in welchem ​​Verzeichnis grep search in der ersten Form ausgeführt wird.

UDATE: grep version: grep (GNU grep) 2.10


quelle
3
Versuchen Sie, wegzuschreiben, schreiben foomytextbar(gefolgt von Enter), nachdem Sie ausgeführt haben grep -r 'mytext'.
Sr_
2
Vielleicht solltest du angeben, von welchem ​​König das grepist. Mit der GNU verwende grepich unter Linux grep -r 'mytext'und grep -r 'mytext' .mache dasselbe: Suche rekursiv ab dem aktuellen Verzeichnis. Wenn der -rSchalter benutzt wird, sucht GNU grep nicht nach STDIN.
Handarbeit
2
Ah. Ich habe mit grep2.12 getestet : pastebin.com/L4my26QS In der Zwischenzeit habe ich Folgendes in der NEWS-Datei zu Version 2.11 (2012-03-02) gefunden: "Wenn kein Dateioperand angegeben ist und eine Befehlszeile -r oder eine gleichwertige Option angegeben ist , grep durchsucht nun das Arbeitsverzeichnis. Früher hat grep das -r ignoriert und die Standardeingabe nicht rekursiv durchsucht. Ein -r in GREP_OPTIONS hat diesen neuen Effekt nicht. "
manatwork
3
GNU grep hat kürzlich das Verhalten mit dem Argument -r geändert (siehe Commit ). "Grep -r PATTERN" mit neuerem grep durchsucht also das aktuelle Verzeichnis und nicht STDIN.
hluk
2
@Mikel, ich habe meine Frage mit einer Grep-Version aktualisiert. Es scheint, dass die Antwort, auf die ich als richtig hingewiesen habe, in der Tat richtig ist, weil ich ein 'altes' Grep verwende. Daher ist es egal, ob ich -r spezifiziere oder nicht. Wenn kein Verzeichnis angegeben ist, wird in STDIN gesucht. Übrigens, danke für diese Untersuchung, jetzt werde ich über zukünftige Änderungen in grep

Antworten:

24

Eigentlich sucht es nirgendwo. Es wartet auf die Eingabe von der Standardeingabe.

Versuche dies:

beast:~ viroos$ grep foo

Wenn Sie eine Zeile mit "foo" eingeben und die Eingabetaste drücken, wird diese Zeile wiederholt, andernfalls wird der Cursor in eine neue Zeile verschoben, aber grep gibt nichts aus.

Maciek Sawicki
quelle
6
Wie ich oben grep -r PATTERNmit einer neueren Version von GNU kommentiert habe, liest grep keine Standardeingabe, sondern sucht nach einem Muster im aktuellen Verzeichnis (siehe Commit ). Diese Änderung ist sinnvoll, da Sie wahrscheinlich nicht nach Standardeingaben suchen möchten, wenn Sie -rflag angeben .
Luk
Ich habe meine grep-Version überprüft, es ist 2.10, daher ist diese Antwort absolut relevant. Übrigens weiß ich jetzt, worauf ich bei neueren Versionen von grep warten muss.
3

Genau wie die vorherige Antwort von Maciek sagt:

Eigentlich sucht es nirgendwo. Es wartet auf die Eingabe von der Standardeingabe.

Sie können jedoch in das stdin eines bereits laufenden Programms schreiben, wenn Sie / proc zur Verfügung haben, indem Sie Daten in dessen 0-ten ersten Deskriptor leiten:

In einem Terminallauf

grep "hello"

und sehen, wie es auf unbestimmte Zeit wartet ... In einem anderen Terminal geben Sie Folgendes ein:

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

siehe das erste Terminal drucken Hallo und Ihren Benutzernamen.

Philluminati
quelle