grep ведет себя по-разному в Fedora против Ubuntu

13

Поэтому, когда я запускаю это в Fedora, я вижу это:

$ 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

Но когда я работаю в Ubuntu (те же данные), я не получаю никаких результатов от 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'

Есть идеи, что может происходить? Как я могу придумать что-то, что будет работать одинаково в обеих системах?

Greg_the_Ant
источник
Как насчет ls *-ref.alleles?
Гленн Джекман
@glennjackman, я думал об этом, но кто-то сделал именно это и прокомментировал эту строку в скрипте bash, который я пытаюсь исправить :-) Я могу только предположить, что у них была причина ...
Greg_the_Ant

Ответы:

30
grep -F '-ref.alleles'

эквивалентно:

grep -F -ref.alleles

(ни один из символов между апострофами не является метасимволами оболочки, поэтому цитирование их не имеет никакого эффекта.)

Это в свою очередь эквивалентно:

grep -F -r -e f.alleles

путем обычного разбора -префиксных опций. -eПараметр принимает аргумент, но -Fи -rэтого не делают.

Поскольку вы не указали никаких файлов для grep, поведение по умолчанию - работать с stdin ... за исключением того, что этот -rпараметр не имеет смысла, поэтому .вместо этого он по умолчанию рекурсивно ищет (текущий каталог) и игнорирует stdin. В некоторых версиях.

Вам нужно не использовать --«нет больше вариантов» индикатора перед регулярным выражением , которое начинается с -как в

grep -F -- -ref.alleles

Я отследил точку, где -rизменилось поведение без аргументов файла. Это было в версии 2.11, выпущенной 2 марта 2012 года. См. Объявление о выпуске.

Git коммитов, которые повлияли на поведение, это этот и этот .

Если вы работаете grep --versionна своих двух машинах, я уверен, вы обнаружите, что одна из них находится на неправильной стороне 2.11


источник
Отличный ответ, спасибо за исследование вплоть до версии, где поведение изменилось.
Ричардниш
2
Вау, спасибо. Вы правы, у меня есть grep 2.6.3 против grep 2.14.
Greg_the_Ant
6

Ведущая -проблема. Чтобы получить те же результаты, добавьте --:

grep -F -- '-ref.alleles'

От man bash:

A -- signals the end of options and disables further option
processing. Any arguments after the -- are treated as filenames
and arguments.
Кир
источник
1
Почему он отличается в Ubuntu и Fedora? Разве это не должно дать одинаковый отрицательный результат на них обоих?
Glueon
Благодарю. Если эта команда будет передана в другую команду, возникнут ли какие-либо проблемы? Или - просто применить к команде, где она появляется?
Greg_the_Ant
4
Страница руководства по bash на самом деле не актуальна. Это объясняет обработку --собственной командной строки bash, которая не зависит от понимания grep --. Они работают одинаково, потому что это общее соглашение, но в целом страница руководства вашей оболочки ничего не говорит вам о значении аргументов для других программ.
1

Проверьте .bashrc, есть ли в вашей команде grep псевдонимы, которые переопределяют ее поведение. Может быть, это проблема. Также попробуйте grep без параметра "-F".

Glueon
источник