Como complemento à resposta de Romeu, note que
grep pattern --whatever
é exigido pelo POSIX para procurar por padrão no arquivo --whatever
. Isso porque nenhuma opção deve ser reconhecida após argumentos não-opcionais (aqui pattern
).
O GNU grep
nessa instância não é compatível com POSIX. Ele pode ser feito em conformidade, passando a variável de ambiente POSIXLY_CORRECT (com qualquer valor) para seu ambiente.
Esse é o caso da maioria dos utilitários e utilitários GNU usando uma implementação GNU ou compatível de getopt()
/ getopt_long()
para analisar argumentos de linha de comando.
Há exceções óbvias, como env
, em que env VAR=x grep --version
obtém a versão de grep
, não env
. Outra exceção notável é o shell GNU ( bash
), no qual nem o interpretador nem qualquer um de seus componentes internos aceitam opções após argumentos não opcionais. Mesmo seu getopts
não pode analisar as opções da maneira GNU.
De qualquer forma, POSIXLY_CORRECT não salvará você se fizer
grep -e pattern *.js
(lá, pattern
não é um argumento não opcional, é passado como um argumento para a opção -e
, então mais opções são permitidas depois disso).
Portanto, é sempre uma boa ideia marcar o final das opções com: quando você não pode garantir que o que vem depois não comece com -
(ou +
com algumas ferramentas):
grep -e pattern -- *.js
grep -- pattern *.js
ou use:
grep -e pattern ./*.js
(observe que grep -- pattern *
não ajudará se houver um arquivo chamado -
, enquanto grep pattern ./*
funcionará. grep -e "$pattern"
deve ser usado em vez de grep "$pattern"
caso o $pattern
possa começar com -
).
Houve uma tentativa em meados dos anos 90 de ter bash
sendo capaz de informar getopt()
quais argumentos (normalmente os resultantes de uma expansão glob) não deveriam ser tratados como opções (por meio de um ambiente _<pid>_GNU_nonoption_argv_flags_
variável), mas isso foi removido já que causava mais problemas do que resolvido.