Я хочу найти все файлы в каталоге, который содержит -2 .

Используя ls | grep "-2" возвращает usage: grep...

Использование одинарных кавычек вместо двойных кавычек возвращает то же самое, а также вообще не использует кавычки, в то время как поиск чего-либо еще правильно возвращает совпадающие имена файлов.

Как я помню - это не регулярное выражение специального символа.

Пожалуйста, не сосредотачивайтесь на конкретной проблеме поиска файлов с именем. Прежде всего, я хочу понять, почему grep ведет себя так.

Использование bash в macOS 10.13

1 ответ1

1

Это как если бы он интерпретировал -2 как параметр командной строки, независимо от того, что он заключен в кавычки.

grep не знает , заключен ли параметр в кавычки или нет.

Многие шаги синтаксического анализа выполняются самой оболочкой 1, прежде чем что-либо выполнять вообще - > применяются перенаправления, $ переменные раскрываются, * раскрываются групповые символы, | конвейеры разделяются на набор отдельных команд, а каждая команда разделяется на массив слов.

Итак, запускаете ли вы grep -2 , grep '-2' , grep \-2 или даже x=-2; grep $x , оболочка все еще видит его как тот же список параметров: { grep , -2 }. Это то, что будет передано системному вызову execv(), и это то, что программа grep получит в своем массиве argv[] , независимо от исходного цитирования.


1 Даже в Windows, где командная строка в CreateProcess() представляет собой просто одну строку, большинство портов grep по- прежнему будут иметь такое поведение, поскольку библиотека времени выполнения C выполняет такое же разбиение аргументов во время инициализации.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .