Estou tentando pesquisar recursivamente uma string com, grep
mas recebo o seguinte:
$ grep -r "stuff" *
grep: unrecognized option '---corporate-discount.csv'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
Como impedir que o Bash passe arquivos iniciando -
como argumento?
grep
que elas não são opções.subprocess.Popen(['grep', '-r', '-e' 'stuff', '--corporate-discount.csv'])
em Python, sem bash em lugar nenhum.*
de comandos. Tudo isso pode ser evitado usando-o./*
.--
como um sigil de fim de opções também é perfeitamente razoável; As diretrizes de sintaxe do utilitário POSIX exigem que ela seja respeitada; veja a diretriz 10. (Claro, nem todos os programas seguem as diretrizes do POSIX, mas a resposta é encadear os autores dos programas infratores e / ou expulsá-los do setor).Respostas:
Primeiro, observe que a interpretação dos argumentos iniciados por traços depende do programa que está sendo iniciado
grep
ou de outro. O shell não tem maneira direta de controlá-lo.Supondo que você queira processar esses arquivos (e não ignorá-los completamente)
grep
, juntamente com a maioria dos programas, reconhece--
como indicando o fim das opções, portantofará o que você quiser. O
-e
está lá no casostuff
começa com um-
também.Como alternativa, você também pode usar:
Esse último também evitaria o problema se houvesse um arquivo chamado
-
no diretório atual. Mesmo após o--
separador,grep
interpreta-
como significando stdin, enquanto./-
é o arquivo chamado-
no diretório atual.fonte
Para impedir que a expansão do Bash passe arquivos iniciando com "-", você pode usar:
Que funciona de maneira portável na maioria dos shells, ou, específico para ksh, bash, zsh:
Por exemplo: em um diretório com esses arquivos
Listará apenas (se
extglob
estiver ativo):Mas se o que você deseja é processar todos os arquivos, enquanto diz ao grep para evitar interpretar os arquivos declarados com as
-
como opções, basta adicionar um./
:Ou, se houver garantia de que nenhum arquivo chamado
-
exista exatamente nos arquivos listados (o grep interpretará um arquivo-
como lido pelo stdin ), você poderá usar:fonte
grep -r -- stuff *
é mais simples e funciona com greps não-GNUish também. Então: acrescentou, obrigado. @ StéphaneChazelasgrep
no FreeBSD ainda é baseado no GNUgrep
e ainda possui esse erro de caracterização, pelo qual as opções são reconhecidas após as não opções. Até BSDs como o OpenBSD que reescreveram osgrep
tornaram compatíveis com GNU para portabilidade retroativa (e ainda mostram esse comportamento aqui). No macOS, sh é bash, mas eu espero que o grep não mostre que o comportamento como macOS deve ser compatível com POSIX, mesmo sem $ POSIXLY_CORRECT. De qualquer forma, o grep do OP é compatível com GNU, pois fornece esse erro.echo [!-]*
como um equivalente padrão de ksh (oubash -O extglob
's)echo !(-*)
.