grep zachowuje się inaczej na Fedorze i Ubuntu


13

Kiedy uruchamiam to w Fedorze, widzę to:

$ 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

Ale kiedy uruchamiam na Ubuntu (te same dane), nie otrzymuję żadnych wyników z 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'

Jakieś pomysły, co się dzieje? Jak mogę wymyślić coś, co będzie działać tak samo na obu systemach?


Jak o ls *-ref.alleles?
glenn jackman

@glennjackman, myślałem o tym, ale ktoś dokładnie to zrobił i skomentował ten wiersz w skrypcie bash, który próbuję naprawić :-) Mogę tylko założyć, że mieli powód ...
Greg_the_Ant

Odpowiedzi:


30
grep -F '-ref.alleles'

jest równa:

grep -F -ref.alleles

(żaden z znaków między apostrofami nie jest metaznakami powłoki, więc cytowanie ich nie ma żadnego efektu).

To z kolei odpowiada:

grep -F -r -e f.alleles

przez normalne parsowanie -prefiksowanych opcji. -eOpcja wymaga argumentu, ale -Fi -rnie.

Ponieważ nie określiłeś żadnych plików do grep, domyślnym zachowaniem jest działanie na stdin ... z wyjątkiem tego, że -ropcja nie ma sensu, więc domyślnie przeszukuje .(bieżący katalog) rekurencyjnie zamiast tego i ignoruje stdin. W niektórych wersjach.

Musisz użyć wskaźnika --„więcej opcji” przed wyrażeniem regularnym rozpoczynającym się od -jak w

grep -F -- -ref.alleles

Wyśledziłem punkt, w którym -rzmieniło się zachowanie bez argumentów pliku. To było w wersji 2.11, wydanej 2 marca 2012 r. Zobacz ogłoszenie o wydaniu.

Zatwierdzenia git, które wpłynęły na zachowanie, są tym i tym .

Jeśli działasz grep --versionna dwóch komputerach, jestem pewien, że zauważysz, że jedna z nich jest po niewłaściwej stronie 2.11


Świetna odpowiedź, dziękuję za badania aż do wersji, w której zachowanie się zmieniło.
richardneish

2
wow dzięki. Masz rację, mam grep 2.6.3 vs grep 2.14.
Greg_the_Ant

6

Największy -jest problem. Aby uzyskać takie same wyniki, dodaj --:

grep -F -- '-ref.alleles'

Od man bash:

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

1
Dlaczego różni się w Ubuntu i Fedorze? Czy nie powinno to dać obu wyników tak samo negatywnych?
Glueon

Dzięki. Jeśli to polecenie ma zostać przekazane do innego polecenia, czy - spowodowałoby to jakieś problemy? A może - po prostu stosuje się do polecenia, w którym się pojawia?
Greg_the_Ant

4
Strona podręcznika bash nie jest tak naprawdę istotna. Wyjaśnia sposób traktowania --linii poleceń bash, która jest niezależna od zrozumienia grepa --. Działają w ten sam sposób, ponieważ jest to powszechna konwencja, ale ogólnie strona podręcznika twojej powłoki nie mówi ci nic o znaczeniu argumentów dla innych programów.

1

Sprawdź .bashrc, czy w poleceniu grep są jakieś aliasy, które przesłaniają jego zachowanie. Może to jest problem. Spróbuj także grep bez parametru „-F”.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.