Я хочу найти все файлы в каталоге, содержащем -2
.
Использование ls | grep "-2"
возвратовusage: grep...
Использование одинарных кавычек вместо двойных возвращает тот же результат, как и полное отсутствие кавычек, в то время как поиск по чему-либо другому корректно возвращает соответствующие имена файлов.
Насколько я помню, -
это не специальный символ регулярного выражения.
Пожалуйста, не фокусируйтесь на конкретной проблеме поиска файлов с именем. Я в первую очередь хочу понять, почему grep ведет себя таким образом.
Использование bash на macOS 10.13
решение1
Это похоже на то, как если бы он интерпретировал -2 как параметр командной строки, несмотря на то, что он заключен в кавычки.
grep
не знаетзаключен ли параметр в кавычки или нет.
Многие этапы анализа выполняются самой оболочкой 1 еще до того, как что-либо будет выполнено: >
применяются перенаправления, $
раскрываются переменные, *
раскрываются подстановочные знаки, |
конвейеры разделяются на набор отдельных команд, а каждая команда разделяется на массив слов.
Итак, запускаете ли вы grep -2
, grep '-2'
, grep \-2
, или даже x=-2; grep $x
, оболочка все равно видит это как тот же список параметров: { grep
, -2
}. Это то, что будет передано системному вызову execv(), и это то, чтогрэппрограмма получит в своем argv[]
массиве, независимо от исходного кавычек.
1 Даже в Windows, где командная строка в CreateProcess() представляет собой всего одну строку, большинство портовгрэпбудет по-прежнему иметь такое поведение, поскольку библиотека времени выполнения C выполняет то же самое разделение аргументов во время инициализации.