grep se comportando de maneira diferente no Fedora vs Ubuntu

13

Então, quando eu executo isso no Fedora, estou vendo:

$ 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

Mas quando executo no Ubuntu (mesmos dados), não recebo nenhum resultado do 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'

Alguma idéia do que poderia estar acontecendo? Como posso criar algo que funcione da mesma forma nos dois sistemas?

Greg_the_Ant
fonte
Que tal ls *-ref.alleles?
Glenn Jackman
@glennjackman, pensei nisso, mas alguém fez exatamente isso e comentou essa linha no script bash que estou tentando consertar :-) Só posso supor que eles tenham uma razão ...
Greg_the_Ant

Respostas:

30
grep -F '-ref.alleles'

é equivalente a:

grep -F -ref.alleles

(nenhum dos caracteres entre os apóstrofes é metacaracteres de shell, portanto, citá-los não tem efeito.)

Por sua vez, é equivalente a:

grep -F -r -e f.alleles

pela análise normal de -opções prefixadas. A -eopção leva um argumento, mas -Fe -rnão.

Como você não especificou nenhum arquivo para grep, o comportamento padrão é agir no stdin ... exceto que a -ropção não faz sentido, por isso, o padrão é pesquisar .(o diretório atual) recursivamente e ignora o stdin. Em algumas versões.

Você precisa usar o indicador --"no more options" antes de uma regexp que comece com -como em

grep -F -- -ref.alleles

Eu rastreei o ponto em que o comportamento de -rsem argumentos de arquivo mudou. Estava na versão 2.11, lançada em 2 de março de 2012. Veja o comunicado de lançamento.

O commit do git que afetou o comportamento é esse e esse .

Se você rodar grep --versionem suas duas máquinas, tenho certeza que descobrirá que uma delas está do lado errado da 2.11


fonte
Ótima resposta, obrigado pela pesquisa até a versão em que o comportamento mudou.
Richardneish
2
uau obrigado. Você está certo, eu tenho o grep 2.6.3 vs o grep 2.14.
Greg_the_Ant
6

A liderança -é o problema. Para obter os mesmos resultados, adicione --:

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.
Cyrus
fonte
1
Por que difere no Ubuntu e Fedora? Não deveria dar o mesmo resultado negativo em ambos?
Glueon
Obrigado. Se esse comando for canalizado para outro comando, o - causaria algum problema lá? Ou - apenas se aplica ao comando em que aparece?
Greg_the_Ant
4
A página de manual do bash não é realmente relevante. Ele explica o tratamento da --linha de comando do bash, que é independente do entendimento do grep --. Eles funcionam da mesma maneira porque é uma convenção comum, mas, em geral, a página de manual do seu shell não diz nada sobre o significado dos argumentos para outros programas.
1

Verifique .bashrc se houver algum apelido no seu comando grep que substitua seu comportamento. Talvez seja o problema. Tente também grep sem o parâmetro "-F".

Glueon
fonte