O que você está vendo não é um resultado, é uma mensagem de erro. O formato do erro do grep quando solicitado a pesquisar por um arquivo inexistente é grep: file name: No such file or directory
. Por exemplo:
$ grep foo bar
grep: bar: No such file or directory
É por isso que você obtém grep:
no início e No such file or directory
no final. É também por isso que você não pode redirecionar a saída para um arquivo, ele está sendo impresso para o erro padrão, não para a saída padrão e você está redirecionando o último. Você pode salvar a saída usando 2>>
em vez de >>
. Isso, no entanto, não é o que você quer, pois são erros.
Seu problema é que você está usando -0
com xargs
, o que indica esperar dados separados por nulo. Como seus dados estão realmente separados por novas linhas (cada arquivo está em uma única linha), xargs
diz grep
para procurar por um arquivo com esse nome (o conjunto inteiro de múltiplas linhas). O que você quer fazer é:
grep -Erli --include='*.php' 'return base64_decode' . | xargs grep -l 'isset'
Ou, se os seus nomes de arquivo puderem conter novas linhas e você tiver uma versão de grep
que o suporte, use o -Z
flag do grep para produzir saída separada por nulo:
grep -ZErli --include='*.php' 'return base64_decode' . | xargs -0 grep -l 'isset'
Observe também que uso grep -E
em vez de egrep
. Os egrep
e fgrep
estão obsoletos em favor de grep -E
e grep -F
, respectivamente.