De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: Julio Cezar Neves
Data de Publicação: 6 de maio de 2021
Numa lista de discussão sobre Shell, foi colocada a seguinte pergunta:
grep
pra procurar um padrão iniciado por hífen (-
), eu vou ter que escapá-lo para o grep
não tentar lê-lo como uma opção e retornar erro?
As respostas de Julio Neves e Paulo Roberto Bagatini geraram o artigo a seguir:
Muitos comandos utilizam uma biblioteca chamada getopts
para parsear sua lista
de parâmetros. Existe inclusive um comando built-in do Bash chamado getopts
(veja com help getopts
) que permite estruturar parâmetros para os scripts.
Essa biblioteca interpreta dois hifens (--
) como um indicador de que, após
eles, não serão mais interpretados parâmetros curtos (iniciados por -
)
ou longos (iniciados por --
), apenas parâmetros posicionais.
Assim, sempre que você precisar entrar com parâmetros posicionais iniciados
com hífen em algum comando que utilize essa biblioteca (a maioria dos comandos
comuns), você pode fazer, por exemplo:
Só para relembrar:
-
) solto sempre se refere a dados da std(in|out)
;
--
) marcam o final das opções
Exemplo com um hífen:
$ cat arq1 preço primo prova $ cat arq2 encher mário motor $ cut -c-3 arq1 | paste -d "" - arq2 preencher primário promotor
Exemplo usando dois hifens:
$ > -TRACO # Forma correta de criar um arquivo chamado -TRACO $ rm -TRACO rm: opção -- 'T' inválida Tente 'rm ./-TRACO' para remover o arquivo '-TRACO'. Try 'rm --help' for more information. $ rm -i -- -TRACO rm: remover arquivo comum vazio '-TRACO'? y $ ls -* # Só para mostrar que -TRACO dançou... ls: opção -- '*' inválida Try 'ls --help' for more information.
Então, voltando à pergunta inicial: "Se quiser usar o grep
pra procurar um
padrão iniciado por hífen (-
), eu vou ter que escapá-lo para o grep
não tentar lê-lo como uma opção e retornar erro?", a resposta é: não adianta
nada escapar, pois caractere escapado é para o Bash não interpretar e ele
não tem nada a ver com isso. Assim como você viu no exemplo do rm
,
o erro é gerado pelo grep
.
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários