grep минус число не работает

grep минус число не работает

Я хочу найти все файлы в каталоге, содержащем -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 выполняет то же самое разделение аргументов во время инициализации.

Связанный контент