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