Resumo
sh é um programa diferente de bash .
Detalhe
O problema é que o shell Bourne ( sh ) não é o shell Bourne Again ( bash ). Ou seja, sh não entende o [[ pragma. Na verdade, ele não entende [ também. [ é um programa real ou link para / bin / test (ou / usr / bin / [ / usr / bin / test).
$ which [
/bin/[
$ ls -lh /bin/[
-r-xr-xr-x 2 root wheel 42K Feb 29 17:11 /bin/[
Quando você executa seu script diretamente através de ./test.sh , você está chamando o script como o primeiro argumento para o programa especificado na primeira linha. Neste caso:
#!/usr/bin/env bash
Frequentemente, isso é diretamente o intérprete ( /bin/bash , ou qualquer outro número de outros interpretadores de script), mas no seu caso você está usando env para executar um programa em um ambiente modificado - mas esse argumento segue ainda é bash . Efetivamente, ./test.sh é bash test.sh .
Como sh e bash são shells diferentes com diferentes interpretações de sintaxe, você está vendo esse erro. Se você executar bash test.sh , deverá ver o que é esperado.
Mais informações
Outros apontaram nos comentários que /bin/sh pode ser um link ou outro shell. Historicamente, sh era o shell Bourne no antigo AT & T Unix e, na minha opinião, a descendência canônica. No entanto, isso é diferente nas variações do BSD e divergiu em outros sistemas baseados em Unix e distribuições ao longo do tempo. Se você estiver realmente interessado no funcionamento interno (incluindo como / bin / sh e / bin / bash podem ser o mesmo programa e se comportar de forma totalmente diferente), leia o seguinte: