TL; DR : eles não são iguais e o propósito é um pouco diferente, embora eles tenham o mesmo efeito desejado.
A diferença está em quem faz a verificação lógica. Como você deve saber, os colchetes são sinônimos do comando test
. Portanto, com -o
, você vê o comando single test e as duas condições são avaliadas juntas e, em seguida, retornam o status de saída para bash.
Com &&
, você tem duas declarações test
, cada uma retornando separadamente, mas depois o bash avalia se ambas são verdadeiras. O último é recomendado hoje em dia, já que test
é um pouco datado e tem problemas (e a nova versão do teste [[
é frequentemente recomendada, veja this ), além disso, é muito mais legível, pois os &&
ou ||
são usados em muitas outras linguagens, incluindo C e Java.
Portanto, no primeiro caso, com [
você avalia duas expressões, com &&
avalia os status de saída de dois [
comandos.
Informações adicionais :
Como apontado por @steeldriver nos comentários, há de fato um comando interno test
, que é a implementação interna do bash de /usr/bin/test
. Independentemente desse fato, a maneira como test
e /usr/bin/test
trabalham sintaticamente é exatamente a mesma.
Tenha em mente, entretanto, que se você estiver usando algum outro shell que não seja bash
ou o shell padrão% do Ubuntudash
, provavelmente você estará usando /usr/bin/test
. O shell Korn, ksh
, por exemplo, não possui test
interno.
Tenha em mente também o fato de que &&
e test
não são equivalentes :
-
test
deve avaliar as declarações e retornar o status de saída como qualquer outro comando (consulte especificações POSIX para teste ). Ele tem uma lista completa de coisas que você pode avaliar - existência de arquivos, tipos de arquivos, comparação de inteiros e string. - Os operadores lógicos, como
&&
e||
, são usados pelos shells para avaliar os status de saída de comandos separados, como;
, que é uma das razões em que esses operadores estão sobLists
section . Além disso, eles não podem ser um comando autônomo, comotest
- eles são operadores de lista de shell padrão . Portanto, ao contrário detest
, você não pode usar&&
para verificar se o arquivo existe; você só pode saber se o comando à esquerda foi finalizado com sucesso ou com falha e executar ou não executar o segundo comando de acordo.