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: