Para o seu script específico, uma das formas funcionará, exceto que ./script.sh requer execução e bits legíveis, enquanto bash script.sh requer apenas bits legíveis.
O motivo da diferença no requisito de permissões está em como o programa que interpreta seu script é carregado:
-
./script.shfaz seu shell executar o arquivo como se fosse um executável comum.
O shell se bifurca e usa uma chamada de sistema (por exemplo, execve ) para fazer com que o sistema operacional execute o arquivo no processo bifurcado. O sistema operacional verificará as permissões do arquivo (portanto, o bit de execução precisa ser definido) e encaminhará a solicitação para o carregador de programas , que examina o arquivo e determina como executá-lo. No Linux, os executáveis compilados começam com um número mágico ELF , enquanto os scripts começam com #! ( hashbang ). Um cabeçalho de hashbang significa que o arquivo é um script e precisa ser interpretado pelo programa especificado após o hashbang. Isso permite que um script diga ao sistema como interpretar o script.
Com seu script, o carregador de programas executará /bin/bash e passará ./script.sh como argumento da linha de comando.
-
bash script.shfaz seu shell executarbashe passarscript.shcomo o argumento da linha de comando
Portanto, o sistema operacional carregará bash (nem mesmo observando script.sh , porque é apenas um argumento de linha de comando). O processo bash criado, então, interpretará o script.sh porque é passado como argumento da linha de comando. Como script.sh é lido apenas por bash como um arquivo regular, o bit de execução não é necessário.
Eu recomendo usar ./script.sh , porque você pode não saber qual interpretador o script está exigindo. Então deixe o carregador de programas determinar isso para você.