It is like if it is interpreting -2 as a command line parameter, regardless the fact it is wrapped by quotes.
grep não sabe se um parâmetro é agrupado por aspas ou não.
Muitas etapas de análise são executadas pelo próprio shell 1 antes de executar qualquer coisa - > redirecionamentos são aplicados, $ variáveis são expandidas, * caracteres curinga são expandidos, | pipelines divididos em um conjunto de comandos individuais e cada comando dividido em uma matriz de palavras.
Então, se você executar grep -2 , grep '-2' , grep \-2 ou mesmo x=-2; grep $x , o shell ainda a verá como a mesma lista de parâmetros: { grep , -2 }. Isso é o que será passado para a chamada do sistema execv (), e é o que o programa grep receberá em sua matriz argv[] , independentemente da citação original.
1 Mesmo no Windows, onde a linha de comando em CreateProcess () é apenas uma única string, a maioria das portas do grep ainda terá esse comportamento porque a biblioteca de tempo de execução C executa a mesma divisão de argumentos durante a inicialização.