No macOS, #!/bin/bash
isso significa que um script usará o bash do sistema, que é muito antigo (3.2, ano de 2006) e (para mim, pelo menos) praticamente inútil.
Então você pode instalar o bash moderno usando Homebrew ou MacPorts, e usar algo assim:
#!/usr/bin/env bash
Então, a terceira abordagem é
#!/opt/homebrew/bin/bash
Mas e se você executar esse script em um Mac onde o bash moderno é instalado usando MacPorts em vez do Homebrew?
Qual é a melhor prática aqui? (Talvez criar um link simbólico /usr/local/bin
que aponte para /opt/homebrew/bin/bash
, e depois #!/usr/local/bin
?)
#!/usr/bin/env bash
é a melhor prática, env é a melhor prática para todos os shebangs. MacOS ou não, não há garantia de que seu sistema de destino terá a mesma versão do bash instalada que o sistema em que você escreve o script.Se você quer portabilidade verdadeira, você precisa usar
#!/bin/sh
e mesmo assim você precisa saber quais comandos e métodos POSIX verdadeiros estão disponíveis porque em muitos sistemas /bin/sh é apenas um link simbólico para o bash no--posix
modo e ainda permitirá coisas não posix como arrays. Além disso, você não tem controle sobre nenhum comando externoawk
,sed
,grep
, etc que são usados e serão diferentes de sistema para sistema.No macOS, após uma nova instalação do hombrew, o $PATH é
Então, como o homebrew coloca seu diretório bin antes de /bin
$PATH
e o shell percorre essa variável do início ao fim ao procurar por executáveis, ele executará o bash 5 perfeitamente com#!/usr/bin/env bash
.