grep se comporta de manera diferente en Fedora vs Ubuntu

13

Entonces, cuando ejecuto esto en Fedora, veo esto:

$ ls hmm_data/indivA12_AATAAG/refs/par1/
2R-orths.alleles  2R-ref.alleles
$ ls hmm_data/indivA12_AATAAG/refs/par1/ | grep -F '-ref.alleles'
2R-ref.alleles

Pero cuando ejecuto Ubuntu (mismos datos) no obtengo ningún resultado del grep:

$ ls hmm_data/indivA12_AATAAG/refs/par1/
2R-orths.alleles  2R-ref.alleles
$ ls hmm_data/indivA12_AATAAG/refs/par1/ | grep -F '-ref.alleles'

¿Alguna idea de lo que podría estar pasando? ¿Cómo puedo llegar a algo que funcione igual en ambos sistemas?

Greg_the_Ant
fuente
¿Qué tal ls *-ref.alleles?
Glenn Jackman
@glennjackman, pensé en eso, pero alguien hizo exactamente eso y comentó esa línea en el script de bash que estoy tratando de arreglar :-) Solo puedo suponer que tenían una razón ...
Greg_the_Ant

Respuestas:

30
grep -F '-ref.alleles'

es equivalente a:

grep -F -ref.alleles

(ninguno de los caracteres entre los apóstrofes son metacaracteres de shell, por lo que citarlos no tiene ningún efecto).

Esto es a su vez equivalente a:

grep -F -r -e f.alleles

mediante el análisis normal de las -opciones con prefijo. La -eopción toma un argumento, pero -Fy -rno.

Como no especificó ningún archivo para grep, el comportamiento predeterminado es actuar en stdin ... excepto que la -ropción no tiene sentido, por lo que el valor predeterminado es buscar .(el directorio actual) de forma recursiva e ignora stdin. En algunas versiones

Debe usar el --indicador "no hay más opciones" antes de una expresión regular que comience -como en

grep -F -- -ref.alleles

Rastreé el punto donde -rcambió el comportamiento de sin argumentos de archivo. Fue en la versión 2.11, lanzada el 2 de marzo de 2012. Vea el anuncio de lanzamiento.

Los git commits que afectaron el comportamiento son este y este .

Si ejecuta grep --versionen sus dos máquinas, estoy seguro de que encontrará que una de ellas está en el lado equivocado de 2.11


fuente
Gran respuesta, gracias por la investigación hasta la versión donde el comportamiento cambió.
richardneish
2
Wow gracias. Tienes razón, tengo grep 2.6.3 vs grep 2.14.
Greg_the_Ant
6

El principal -es el problema. Para obtener los mismos resultados, agregue --:

grep -F -- '-ref.alleles'

De man bash:

A -- signals the end of options and disables further option
processing. Any arguments after the -- are treated as filenames
and arguments.
Ciro
fuente
1
¿Por qué difiere en Ubuntu y Fedora? ¿No debería dar el mismo resultado negativo en ambos?
Glueon
Gracias. Si este comando se canaliza a otro comando, ¿causaría algún problema allí? ¿O simplemente se aplica al comando donde aparece?
Greg_the_Ant
44
La página de manual de bash no es realmente relevante. Explica el tratamiento de --la propia línea de comando de bash, que es independiente de la comprensión de grep --. Funcionan de la misma manera porque es una convención común, pero en general la página de manual de su shell no le dice nada sobre el significado de los argumentos de otros programas.
1

Verifique .bashrc si hay algún alias en su comando grep que anule su comportamiento. Tal vez sea el problema. Pruebe también grep sin el parámetro "-F".

Glueon
fuente