grep поводиться по-різному на Fedora vs 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'

Будь-які ідеї, що може йти? Як я можу придумати щось, що буде працювати однаково для обох систем?


Як щодо ls *-ref.alleles?
glenn jackman

@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. Дивіться анонс випуску.

Команди, що впливають на поведінку, - це ця і ця .

Якщо ви працюєте grep --versionна своїх двох машинах, я впевнений, що ви виявите, що одна з них не на 2.11


Чудова відповідь, дякую за дослідження аж до версії, де змінилася поведінка.
richardneish

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 man" не дуже актуальна. Це пояснює поводження з --власним командним рядком bash, яке не залежить від розуміння грепом --. Вони працюють так само, тому що це звичайна умова, але загалом сторінка вашої оболонки нічого не говорить про значення аргументів для інших програм.

1

Перевірте .bashrc, чи є у вашій команді grep якісь псевдоніми, які перекривають його поведінку. Можливо, це питання. Спробуйте також grep без параметри "-F".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.