Existem algumas diferenças.
./scriptname
requer que o arquivo chamado scriptname
seja executável, e ele usa o shell especificado como sua primeira linha (no “shebang”, por exemplo #!/bin/sh
), se houver.
sh scriptname
funciona desde que o arquivo chamado scriptname
seja legível e use sh
(seja lá o que for), independentemente do que o shebang do script especificar. Com alguns shells, se scriptname
não existir no diretório atual, os diretórios especificados em PATH
serão pesquisados e o primeiro scriptname
encontrado lá (se houver) será lido e interpretado.
Coloque de outra forma,
sh scriptname
funcionará sem configuração, mas você pode usar o shell errado e executar o script errado.
./scriptname
tentará executar o script correto usando o shell correto (ou, pelo menos, o shell especificado pelo autor do script, se houver), mas pode precisar de alguma configuração primeiro ( chmod a+x scriptname
).