grep se comporte différemment sur Fedora vs Ubuntu

13

Donc quand je lance ça dans Fedora, je vois ça:

$ 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

Mais quand je cours sur Ubuntu (mêmes données) je n'obtiens aucun résultat du 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'

Des idées sur ce qui pourrait se passer? Comment puis-je trouver quelque chose qui fonctionnera de la même manière sur les deux systèmes?

Greg_the_Ant
la source
Et alors ls *-ref.alleles?
glenn jackman
@glennjackman, j'y ai pensé mais quelqu'un a fait exactement cela et a commenté cette ligne dans le script bash que j'essaye de corriger :-) Je ne peux que supposer qu'ils avaient une raison ...
Greg_the_Ant

Réponses:

30
grep -F '-ref.alleles'

est équivalent à:

grep -F -ref.alleles

(aucun des caractères entre les apostrophes n'est un métacaractère shell, donc les citer n'a aucun effet.)

Cela équivaut à son tour à:

grep -F -r -e f.alleles

par analyse normale des -options préfixées. L' -eoption prend un argument, mais -Fet -rnon.

Comme vous n'avez spécifié aucun fichier à grep, le comportement par défaut consiste à agir sur stdin ... sauf que l' -roption n'a aucun sens, elle est par défaut .récursive (le répertoire courant) à la place et ignore stdin. Dans certaines versions.

Vous devez utiliser l' --indicateur "no more options" avant une expression rationnelle qui commence par -comme dans

grep -F -- -ref.alleles

J'ai retrouvé le point où le comportement de -rsans arguments de fichier a changé. Il était dans la version 2.11, publiée le 2 mars 2012. Voir l'annonce de sortie.

Les commits git qui ont affecté le comportement sont celui-ci et celui-ci .

Si vous exécutez grep --versionsur vos deux machines, je suis sûr que vous constaterez que l'une d'elles est du mauvais côté de la 2.11


la source
Excellente réponse, merci pour la recherche jusqu'à la version où le comportement a changé.
richardneish
2
Ouah merci. Vous avez raison, j'ai grep 2.6.3 vs grep 2.14.
Greg_the_Ant
6

Le principal -est le problème. Pour obtenir les mêmes résultats, ajoutez --:

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
la source
1
Pourquoi est-ce différent sur Ubuntu et Fedora? Cela ne devrait-il pas donner le même résultat négatif sur les deux?
Glueon
Merci. Si cette commande doit être redirigée vers une autre commande, est-ce que - causera des problèmes là-bas? Ou est-ce que - s'applique simplement à la commande où elle apparaît?
Greg_the_Ant
4
La page de manuel bash n'est pas vraiment pertinente. Il explique le traitement de --la propre ligne de commande de bash, qui est indépendante de la compréhension de grep --. Ils fonctionnent de la même manière car c'est une convention courante, mais en général la page de manuel de votre shell ne vous dit rien sur la signification des arguments des autres programmes.
1

Vérifiez .bashrc s'il existe des alias sur votre commande grep qui remplacent son comportement. C'est peut-être le problème. Essayez également grep sans le paramètre "-F".

Glueon
la source