Se você tivesse usado zsh
ou (t)csh
em vez de bash
, teria entendido seu erro:
$ ps -ef | grep [c]ron
zsh: no matches found: [c]ron
Acima, você tem um padrão globbing que deve ser expandido para a lista de arquivos no diretório atual que corresponde a esse padrão.
Na maioria dos shells parecidos com Bourne e rc, no entanto, se não houver nenhum arquivo correspondente, o padrão é silenciosamente passado intocado para o comando.
É por isso que funciona com [c]ron
, porque não há nenhum arquivo chamado cron
no diretório atual, mas não com [a]2draw
, porque há um arquivo correspondente a esse padrão no diretório atual, ele é expandido por o shell para a2draw
e grep
obtém um argumento a2draw
em vez de [a]2draw
.
Observe que bash
pode ser configurado para funcionar como zsh
, nesse caso:
shopt -s failglob
O shell fish
também relata um erro quando um glob não corresponde. No entanto, [...]
não é um operador globbing em fish
.
O que isso significa é que você precisa citar os caracteres globbing quando não pretende que sejam expandidos:
ps -ef | grep '[a]2draw'
Você pode sair sem fazer isso em bash
ou outros shells parecidos com Bourne, exceto zsh
, mas isso faz com que bugs inativos estejam prontos para serem acionados no dia em que você executar o comando em um diretório que tenha um arquivo correspondente.
Eu posso ter efeitos colaterais desagradáveis, como em contextos insuspeitados. Como:
rm -?
Em um diretório que tenha arquivos chamados --
, -x
e -y
removerá os dois -x
e -y
.