grep verhält sich auf Fedora anders als auf Ubuntu


13

Wenn ich das in Fedora starte, sehe ich folgendes:

$ 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

Aber wenn ich auf Ubuntu (gleiche Daten) laufe, bekomme ich keine Ergebnisse von der 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'

Irgendwelche Ideen, was los sein könnte? Wie kann ich etwas finden, das auf beiden Systemen gleich funktioniert?


Wie wäre es ls *-ref.alleles?
Glenn Jackman

@glennjackman, ich habe darüber nachgedacht, aber jemand hat genau das getan und diese Zeile im Bash-Skript kommentiert, das ich zu
korrigieren

Antworten:


30
grep -F '-ref.alleles'

ist äquivalent zu:

grep -F -ref.alleles

(Keines der Zeichen zwischen den Apostrophen ist ein Shell-Metazeichen. Daher hat das Zitieren keinen Effekt.)

Dies entspricht wiederum:

grep -F -r -e f.alleles

durch normales Parsen von -vorangestellten Optionen. Die -eOption akzeptiert ein Argument, aber -Fund -rnicht.

Da Sie keine Dateien für grep angegeben haben, ist das Standardverhalten, auf stdin zu reagieren ... mit der Ausnahme, dass die -rOption keinen Sinn macht .und stattdessen standardmäßig rekursiv nach (dem aktuellen Verzeichnis) sucht und stdin ignoriert. In einigen Versionen.

Sie müssen den --Indikator "keine weiteren Optionen" verwenden, bevor ein regulärer Ausdruck mit " -wie in " beginnt

grep -F -- -ref.alleles

Ich habe den Punkt aufgespürt, an dem sich das Verhalten -rohne Dateiargumente geändert hat. Es war in der Version 2.11, die am 2. März 2012 veröffentlicht wurde. Siehe Ankündigung der Veröffentlichung.

Die Git-Commits, die das Verhalten beeinflusst haben, sind dieses und dieses .

Wenn Sie grep --versionauf Ihren beiden Rechnern laufen , werden Sie sicher feststellen, dass sich einer von ihnen auf der falschen Seite von 2.11 befindet


Tolle Antwort, danke für die Recherche bis zu der Version, in der sich das Verhalten geändert hat.
Richardneish

2
Wow, danke. Du hast recht, ich habe grep 2.6.3 vs grep 2.14.
Greg_the_Ant

6

Die Führung -ist das Problem. Um die gleichen Ergebnisse zu erhalten, fügen Sie Folgendes hinzu --:

grep -F -- '-ref.alleles'

Von man bash:

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

1
Warum unterscheidet es sich auf Ubuntu und Fedora? Sollte es nicht bei beiden das gleiche negative Ergebnis geben?
Glueon

Vielen Dank. Wenn dieser Befehl in einen anderen Befehl umgeleitet werden soll, würde das dort Probleme verursachen? Oder gilt - nur für den Befehl, bei dem er angezeigt wird?
Greg_the_Ant

4
Die Bash-Manpage ist nicht wirklich relevant. Es erklärt die Behandlung von --auf Bashs eigener Kommandozeile, die unabhängig von Greps Verständnis von ist --. Sie funktionieren auf die gleiche Weise, da dies eine übliche Konvention ist, aber im Allgemeinen sagt Ihnen die Manpage Ihrer Shell nichts über die Bedeutung von Argumenten für andere Programme aus.

1

Überprüfen Sie .bashrc, ob Ihr grep-Befehl Aliase enthält, die dessen Verhalten außer Kraft setzen. Vielleicht ist es das Problem. Versuchen Sie auch grep ohne den Parameter "-F".

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.