Ошибка или функция? Grep принимает файлы как флаги

Command:

mv /home/aaa/star2/* ~/
rmdir /home/aaa/star2
4
27.06.2017, 00:30
2 ответа

Это известная ошибка GNU getopt(используется для разбора опций инструментами GNU).

grep hi -vR

требуется POSIX для поиска hiв файле с именем -vR, так как многие параметры не распознаются после аргументов, не являющихся параметрами (например, hiздесь ).

Большинство инструментов или инструментов GNU, использующих GNU getoptAPI в режиме по умолчанию, не соблюдают это, если только POSIXLY_CORRECTне находится в среде.

Таким образом, вам нужно либо:

POSIXLY_CORRECT=1 grep hi *

(заставить grepвести себя в соответствии с POSIX), либо

grep -- hi *

(явно отметить конец параметров с помощью --) или

grep hi ./*

(убедитесь, что все имена файлов начинаются с ./, а не с -).

В любом случае, с:

grep -e hi -vR

у вас будут проблемы с GNU и не-GNU grep, так как hiне является необязательным аргументом, а аргумент опции -e, поэтому вам потребуется:

grep -e hi -- *

или (лучше, так как это также решает проблему файла с именем -):

grep -e hi ./*

(POSIXLY_CORRECT будет не помогает).

4
27.01.2020, 20:49

Это «особенность» GNU grep (и других утилит GNU, которые аналогичным образом анализируют командную строку). Подпрограммы синтаксического анализа командной строки, которые использует GNU, позволяют указывать флаги после того, что должно быть последним операндом в командной строке.

Чтобы обойти это, явно сообщите утилите, что больше не будет флагов командной строки:

$ grep -- hi *

Это заставляет grep обрабатывать имена файлов, расширенные из * оболочкой. как имена файлов, а не как опции.

4
27.01.2020, 20:49

Теги

Похожие вопросы