Onde o grep -r pesquisa por padrão?

16

Descobri que se procurasse usando grep sem especificar um caminho, como grep -r 'mytext'se demorasse infinitamente. Enquanto isso, se eu procurar com o caminho especificado, grep -r 'mytext' .ele encontra instantaneamente o que eu preciso. Então, estou curioso, em primeira forma, em qual diretório o grep pesquisa?

UDATE: versão grep: grep (GNU grep) 2.10


fonte
3
Tente digitar, escreva foomytextbar(seguido de Enter) depois de executar grep -r 'mytext'.
sr_
2
Talvez você deva especificar de que rei grepé isso. Com o GNU grep, uso no Linux grep -r 'mytext'e grep -r 'mytext' .faz o mesmo: pesquise recursivamente a partir do diretório atual. Quando o -rswitch é usado, o GNU grep não procura STDIN.
Manatwork 16/05/12
2
Ah Eu testei com grep2.12: pastebin.com/L4my26QS Enquanto isso, encontrei isso no arquivo NEWS referente à versão 2.11 (02-03-2012): "Se nenhum operando de arquivo for fornecido, e uma opção de linha de comando -r ou equivalente for fornecida , o grep agora pesquisa no diretório de trabalho. Anteriormente, o grep ignorava o -r e pesquisava a entrada padrão de forma não recursiva. Um -r encontrado em GREP_OPTIONS não tem esse novo efeito. "
Manatwork
3
O GNU grep mudou recentemente o comportamento com o argumento -r (veja o commit ). Portanto, "grep -r PATTERN" com o grep mais recente pesquisará o diretório atual e não o STDIN.
Hluk 16/05
2
@ Mikel, atualizei minha pergunta com uma versão grep. Parece que a resposta que eu apontei como correta é de fato uma correta, porque estou usando um grep 'antigo'. Portanto, não importa se eu especifique -r ou não, se nenhum diretório for fornecido, ele procurará em STDIN. Btw, obrigado por essa investigação, agora, eu vou estar ciente de futuras mudanças no grep;)

Respostas:

24

Na verdade, ele não pesquisa em lugar nenhum. Aguarda a entrada da entrada padrão.

Tente o seguinte:

beast:~ viroos$ grep foo

quando você digita a linha contendo "foo" e pressiona enter, esta linha será repetida; caso contrário, o cursor será movido para a nova linha, mas o grep não imprimirá nada.

Maciek Sawicki
fonte
6
Como comentei acima grep -r PATTERNcom a versão mais recente do GNU, o grep não lerá a entrada padrão, mas procurará o padrão no diretório atual (consulte o commit ). Essa alteração faz sentido, pois você provavelmente não deseja pesquisar a entrada padrão ao especificar o -rsinalizador.
Hluk 16/05
Eu verifiquei minha versão grep, é 2.10, então esta resposta é perfeitamente relevante. Btw, agora, eu vou saber o que esperar de versões mais recentes do grep.
3

Exatamente como a resposta anterior de Maciek diz:

Na verdade, ele não pesquisa em lugar nenhum. Aguarda a entrada da entrada padrão.

No entanto, você pode gravar no stdin de um programa já em execução, se você tiver / proc disponível, canalizando dados para o 0º primeiro descritor:

Em um terminal

grep "hello"

e veja-o esperar indefinidamente ... Em outro terminal, digite este:

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

veja o primeiro terminal imprima olá e seu nome de usuário.

Philluminati
fonte