if command; then ...
avalia o status de saída de command . 0 é sucesso (avalia a condição como verdadeira).
Primeiro de tudo: [ é (quase) idêntico a test , portanto, espera que a string command esteja em conformidade com sua sintaxe.
if [ $(command) ]; then ...
avalia a string contendo a saída de command . Na maioria dos casos, não funcionará - veja o exemplo abaixo.
[ command ] && ..
grep -l "mail" "file" será interpretado assim:
-
grep- uma string -
-l- operador unário retornando o tamanho da string a seguir -
"mail"- uma string, será passada como um argumento para o operador-l -
"file"- uma string
Dependendo da implementação, você receberá erros ligeiramente diferentes, porque o acima está pedindo a [ para avaliar uma sequência que consiste em uma string, um número e outra string, sem nenhum operador. Por padrão [ (assim como test ) é um shell embutido, você pode comparar as mensagens de erro com o binário autônomo (geralmente /bin/[ ou /usr/bin/[ ).