Bem, você sabe que o padrão de pesquisa contém um '-' e você sabe que, quando o padrão de pesquisa contiver um '-', será necessário usar o sinalizador -e
. Como você não está usando o sinal -e
, o shell está interpretando seu "padrão" como um argumento (e um parâmetro). Você pode ver isso com:
$ grep "-foo" file1
grep: oo: No such file or directory
Por extensão, seu código grep "-example" file1
está dizendo ao shell que você deseja executar grep
com o argumento -e
e um parâmetro "xample".
Este é o mesmo problema que encontramos quando tentamos algo como rm -my-silly-file-name
- não funciona, e precisamos usar algo como rm ./-my-silly-file-name
. Outra solução alternativa seria rm -- -my-silly-file-name
. Podemos usar esse idioma aqui:
$ grep -- "-example" < file1
-example
O "-" diz ao shell que tudo depois dele não é um argumento.
Alternativamente, você pode simplesmente escapar do "-" com um "\", como você viu:
grep "\-example" file1
Este artigo vai em alguns detalhes sobre a citação : a parte relevante é Parâmetros e comandos backquoted que devem ser interpretados pelo shell são colocados entre aspas duplas. Quando você usa aspas duplas, o conteúdo é interpretado por o shell.