Où grep -r recherche par défaut?

16

J'ai trouvé si je cherchais en utilisant grep sans spécifier de chemin, comme grep -r 'mytext'cela prend infiniment de temps. Pendant ce temps, si je recherche avec le chemin spécifié, grep -r 'mytext' .il trouve instantanément ce dont j'ai besoin. Donc, je suis curieux, en première forme, dans quel répertoire grep recherche-t-il?

UDATE: version grep: grep (GNU grep) 2.10


la source
3
Essayez de taper, d'écrire foomytextbar(suivi de Entrée) après avoir exécuté grep -r 'mytext'.
sr_
2
Vous devriez peut-être préciser de quel roi il greps'agit. Avec le GNU grepque j'utilise sous Linux grep -r 'mytext'et grep -r 'mytext' .fait la même chose: recherche récursivement à partir du répertoire courant. Lorsque le -rcommutateur est utilisé, GNU grep ne recherche pas STDIN.
manatwork
2
Ah. J'ai testé avec grep2.12: pastebin.com/L4my26QS En attendant, j'ai trouvé cela dans le fichier NEWS concernant la version 2.11 (2012-03-02): "Si aucun opérande de fichier n'est donné, et une ligne de commande -r ou une option équivalente est donnée , grep recherche maintenant dans le répertoire de travail. Auparavant, grep ignorait l'entrée -r et recherchait l'entrée standard de manière non récursive. Un -r trouvé dans GREP_OPTIONS n'a pas ce nouvel effet. "
manatwork
3
GNU grep a récemment changé de comportement avec l'argument -r (voir le commit ). Donc, "grep -r PATTERN" avec un grep plus récent recherchera le répertoire courant et non STDIN.
hluk
2
@Mikel, j'ai mis à jour ma question avec une version grep. Il semble que la réponse que j'ai pointée comme correcte soit en effet une bonne, car j'utilise un «ancien» grep. Donc, peu importe, je spécifie -r ou non, si aucun répertoire n'est fourni, il recherche dans STDIN. Btw, merci pour cette enquête, maintenant, je serai au courant des changements futurs dans grep;)

Réponses:

24

En fait, il ne recherche nulle part. Il attend l'entrée de l'entrée standard.

Essaye ça:

beast:~ viroos$ grep foo

lorsque vous tapez une ligne contenant "foo" et appuyez sur Entrée, cette ligne sera répétée sinon le curseur sera déplacé vers une nouvelle ligne mais grep n'imprimera rien.

Maciek Sawicki
la source
6
Comme je l'ai commenté ci-dessus grep -r PATTERNavec une version plus récente de GNU, grep ne lira pas l'entrée standard mais recherchera le modèle dans le répertoire courant (voir le commit ). Cette modification est logique car vous ne souhaitez probablement pas rechercher une entrée standard lorsque vous spécifiez un -rindicateur.
hluk
J'ai vérifié ma version grep, c'est 2.10, donc cette réponse est parfaitement pertinente. Btw, maintenant, je saurai quoi attendre des nouvelles versions de grep.
3

Exactement comme le disait la réponse précédente de Maciek:

En fait, il ne recherche nulle part. Il attend l'entrée de l'entrée standard.

Cependant, vous pouvez écrire dans le stdin d'un programme déjà en cours d'exécution si vous avez / proc disponible en canalisant les données dans son 0e premier descripteur:

En un seul terminal

grep "hello"

et le voir attendre indéfiniment ... Dans un autre terminal, tapez ceci:

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

voir le premier terminal imprimer bonjour et votre nom d'utilisateur.

Philluminati
la source