grep si comporta diversamente su Fedora vs Ubuntu


13

Quindi quando eseguo questo in Fedora vedo questo:

$ 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

Ma quando corro su Ubuntu (stessi dati) non ottengo alcun risultato dal 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'

Qualche idea su cosa potrebbe succedere? Come posso trovare qualcosa che funzioni allo stesso modo su entrambi i sistemi?


Che ne dici ls *-ref.alleles?
Glenn Jackman,

@glennjackman, ci ho pensato, ma qualcuno ha fatto esattamente questo e ha commentato quella riga nello script bash che sto cercando di risolvere :-) Posso solo supporre che avessero un motivo ...
Greg_the_Ant

Risposte:


30
grep -F '-ref.alleles'

è equivalente a:

grep -F -ref.alleles

(nessuno dei caratteri tra gli apostrofi sono metacaratteri di shell, quindi la loro citazione non ha alcun effetto.)

Questo a sua volta equivale a:

grep -F -r -e f.alleles

analizzando normalmente le -opzioni prefissate. L' -eopzione ha un argomento, ma -Fe -rnon.

Dato che non hai specificato alcun file da grep, il comportamento predefinito è agire su stdin ... tranne che l' -ropzione non ha senso, quindi per impostazione predefinita ricorre in .modo ricorsivo (la directory corrente) e ignora stdin. In alcune versioni

È necessario utilizzare l'indicatore --"non più opzioni" prima di una regexp che inizia con -come in

grep -F -- -ref.alleles

Ho rintracciato il punto in cui è -rcambiato il comportamento senza argomenti di file. Era nella versione 2.11, rilasciata il 2 marzo 2012. Vedi l'annuncio di rilascio.

I git commessi che hanno influenzato il comportamento sono questo e questo .

Se corri grep --versionsulle tue due macchine, sono sicuro che scoprirai che una di esse è dalla parte sbagliata della 2.11


Ottima risposta, grazie per la ricerca fino alla versione in cui il comportamento è cambiato.
richardneish,

2
Wow grazie. Hai ragione, ho grep 2.6.3 vs grep 2.14.
Greg_the_Ant

6

Il principale -è il problema. Per ottenere gli stessi risultati aggiungi --:

grep -F -- '-ref.alleles'

Da man bash:

A -- signals the end of options and disables further option
processing. Any arguments after the -- are treated as filenames
and arguments.

1
Perché differisce su Ubuntu e Fedora? Non dovrebbe dare lo stesso risultato negativo su entrambi?
Glueon,

Grazie. Se questo comando dovesse essere reindirizzato a un altro comando, il - causerebbe problemi lì? Oppure: basta applicare al comando in cui appare?
Greg_the_Ant,

4
La pagina man di bash non è molto rilevante. Spiega il trattamento della --riga di comando di bash, che è indipendente dalla comprensione di grep --. Funzionano allo stesso modo perché è una convenzione comune, ma in generale la pagina man della shell non ti dice nulla sul significato degli argomenti per altri programmi.

1

Controlla .bashrc se ci sono alias nel tuo comando grep che sovrascrivono il suo comportamento. Forse è il problema. Prova anche grep senza il parametro "-F".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.