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.sh
faz 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.sh
faz seu shell executarbash
e passarscript.sh
como 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ê.