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/[
).