Substituições de comando e variável no shell ocorrem após decidir sobre limites de comando e analisar redirecionamentos (e atribuições). Você pode colocar um nome de programa e / ou argumentos em uma variável e substituí-los, mas não pipes ou redirecionamento ou outras substituições incluindo $( command )
ou atribuições ou palavras-chave shell como if
e for
.
Nesse caso, você pode eliminar o pipe, o wc e a substituição alterando o comando e revertendo o teste:
cmd='grep -qi _dev /etc/hosts' # note file as argument not redirection
$$cmd || do_blah
em que o comando grep substituído falha (silenciosamente) se ele não encontrar qualquer correspondência no arquivo e, se falhar, do_blah será executado.
Em geral, para usar a sintaxe shell (não apenas argumentos do programa) em um valor substituto, você deve usar eval
para executar o valor (ou valores) substituído, ou então executar um shell filho como sh -c "$$cmd"
(substituir outro shell se necessário, dependendo do ambiente e / ou comando).