Estoy tratando de buscar recursivamente una cadena con grep
pero obtengo esto:
$ grep -r "stuff" *
grep: unrecognized option '---corporate-discount.csv'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
¿Cómo puedo evitar que Bash pase archivos que comienzan -
como argumento?
grep
que no son opciones.subprocess.Popen(['grep', '-r', '-e' 'stuff', '--corporate-discount.csv'])
en Python, no bash en ningún lado.*
de comandos. TODOS estos se pueden evitar utilizando en su./*
lugar.--
como sigil de fin de opciones también es perfectamente razonable; Las pautas de sintaxis de la utilidad POSIX requieren que se respete; ver directriz # 10. (Claro, no todos los programas siguen las pautas POSIX, pero la respuesta es encadenar a los autores de los programas infractores y / o expulsarlos de la industria).Respuestas:
Primero, tenga en cuenta que la interpretación de los argumentos que comienzan con guiones depende del programa que se inicie
grep
u otro. El shell no tiene forma directa de controlarlo.Suponiendo que desea procesar dichos archivos (y no ignorarlos por completo)
grep
, junto con la mayoría de los programas, reconoce--
que indica el final de las opciones, por lo queHará lo que quieras. El
-e
está allí en caso de questuff
comience con un-
también.Alternativamente, también puedes usar:
Este último también evitaría el problema si hubiera un archivo llamado
-
en el directorio actual. Incluso después del--
separador,grep
interpreta-
como significado stdin, mientras./-
que el archivo se llama-
en el directorio actual.fuente
Para evitar que la expansión Bash pase archivos que comienzan con “-” , puede usar:
Que funciona de forma portátil en la mayoría de los shells, o, específicamente para ksh, bash, zsh:
Por ejemplo: en un directorio con estos archivos
Solo se enumerará (siempre que
extglob
esté activo):Pero si lo que desea es procesar todos los archivos mientras le dice a grep que evite interpretar los archivos indicados con una
-
opción como, entonces simplemente agregue un./
:O bien, si existe la garantía de que no existe un archivo llamado exactamente
-
en los archivos enumerados (grep interpretará un solo-
como leído desde stdin ), puede usar:fuente
grep -r -- stuff *
es más simple y también funciona con greps no GNUish. Entonces: agregado, gracias. @ StéphaneChazelasgrep
en FreeBSD todavía se basa en GNUgrep
y todavía tiene esa característica errónea de que las opciones se reconocen después de no opciones. Incluso los BSD como OpenBSD que han reescrito los hangrep
hecho compatibles con GNU para la portabilidad hacia atrás (y aún muestran ese comportamiento aquí). En macOS, sh es bash, pero espero que su grep no muestre ese comportamiento ya que macOS debe cumplir con POSIX incluso sin $ POSIXLY_CORRECT. En cualquier caso, el grep del OP es compatible con GNU ya que da ese error.echo [!-]*
como un equivalente estándar de ksh's (obash -O extglob
's)echo !(-*)
.