Estou escrevendo um script bash que contém uma seção if simples com duas condições:
if [[ -n $VAR_A ]] && [[ -n $VAR_B ]]; then
echo >&2 "error: cannot use MODE B in MODE A" && exit 1
fi
Um engenheiro sênior revisou meu código e comentou:
por favor, evite usar && quando você pode simplesmente executar os dois comandos nas linhas subsequentes.
Ele não explicou mais. Mas por curiosidade, gostaria de saber se isso é verdade e qual o motivo de evitar o uso do &&
.
O comentário de revisão provavelmente se refere ao segundo uso do
&&
operador. Você não quer não sair seecho
falhar, eu acho, então escrever os comandos em linhas separadas faz mais sentido:BTW, no bash você pode incluir
&&
dentro das[[ ... ]]
condições:Este não é um comentário geral contra
&&
. Suspeito que o engenheiro com quem você falou estava considerando o caso (muito improvável, mas ainda teoricamente possível) em que oecho
próprio falhou. Se você tem isso:Então, se por qualquer motivo o
echo
comando falhar, oexit
não será executado, então você não pegará o erro. Se você os tiver separados, oexit
será executado mesmo seecho
falhar:Portanto, o engenheiro está certo de que é mais seguro separar essas duas declarações específicas. No entanto, não interprete isso como uma diretiva geral contra o uso de
&&
. Você deve simplesmente certificar-se de usar&&
apenas nos casos em que realmente deseja tornar a execução de um comando dependente da execução bem-sucedida de outro.Por exemplo, isso está perfeitamente bem:
As pessoas fizeram um bom caso para
echo
falhar. Além deste ponto sobre correção, você também pode defender a legibilidade. Você escreveuQuando traduzo isso para o inglês na minha cabeça, recebo algo como:
Alguém lendo isso provavelmente perguntará: "por que você se incomodou em especificar se a operação de impressão foi concluída com êxito "? Nesse caso, as duas linhas são mais simples que a
&&
porque há menos lógica no código. Uma versão em inglês da alternativa de duas linhas recomendada é:Isso é menos complexo, então é preciso menos poder cerebral para lê-lo. Não ficamos imaginando
&&
para que serve.Simplificando, você não deve assumir que o código executado em um caminho de saída não causará um erro em si. Isso não é específico para shell script, mas apenas bons conselhos de programação em geral.
Ao usar
echo ‘foo’ && exit
, você só sairá se for bem-echo 'foo'
sucedido. A probabilidade de isso falhar é extremamente baixa, mas você não deve contar com isso , especialmente quando o custo de fazê-lo corretamente é tão pequeno. Isso se torna significativamente mais importante quando você tem um caminho de saída mais complicado que pode invocar outras funções em seu código e não é óbvio que seu caminho de saída invocará apenas coisas 'principalmente seguras' comoecho
, mas geralmente é uma boa forma usar o código 'correto' em todos os casos para que você adquira o hábito de fazê-lo corretamente (e para que seus colegas saibam o que esperar).Se, por algum motivo, você precisar que seja uma linha (eu diria que isso nunca deveria ser o caso), a sintaxe correta é
echo 'foo' ; exit
, o que faz com que o analisador trate os dois comandos como se estivessem em linhas separadas.Como um aparte, em sua condicional, você quase sempre deve preferir:
que é específico do bash, mas mais eficiente do que o que você tem atualmente, ou:
que funcionará de maneira semanticamente equivalente em qualquer shell compatível com POSIX.
Não há necessidade de escrever dois comandos em uma linha. Se você tivesse 100 comandos em sua instrução if, você não os && juntos porque seria horrível de ler. Embora outras respostas sobre a possibilidade de falha de eco sejam tecnicamente corretas, suspeito que a intenção dos desenvolvedores seniores era sobre legibilidade.