Respostas:
Para o seu script específico, qualquer uma das maneiras 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 dos requisitos de permissão está na maneira como o programa que interpreta o seu script é carregado:
./script.sh
faz seu shell executar o arquivo como se fosse um executável regular.O shell se bifurca e usa uma chamada do sistema (por exemplo execve
) para fazer o sistema operacional executar 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 ao carregador do programa , que analisa 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 um #!
( hashbang ). Um cabeçalho hashbang significa que o arquivo é um script e precisa ser interpretado pelo programa especificado após o hashbang. Isso permite que um script em si diga ao sistema como interpretá-lo.
Com o seu script, o carregador de programas será executado /bin/bash
e transmitido ./script.sh
como o argumento da linha de comandos.
bash script.sh
faz seu shell rodar bash
e passar script.sh
como o argumento da linha de comandoPortanto, o sistema operacional será carregado bash
(nem mesmo olhando script.sh
, porque é apenas um argumento da linha de comando). O bash
processo criado interpretará o script.sh
porque é passado como o argumento da linha de comando. Como script.sh
é lido apenas bash
como um arquivo regular, o bit de execução não é necessário.
Eu recomendo o uso ./script.sh
, porque você pode não saber qual intérprete o script está exigindo. Então deixe o carregador do programa determinar isso para você.
. ./script.sh
não é a mesma coisa que bash script.sh
(ou ./script.sh
Considere o script. #!/usr/bin/python -V
<Newline> print test
.
. script.sh
. Mas concordo com as pessoas que desencorajam o uso do .
comando em scripts que não deveriam ser invocados dessa maneira. Estou surpreso que ninguém tenha mencionado que, se o script contiver exit
comandos e você o originar, ele poderá desconectá-lo. Um problema menos grave seria se o script fizesse a cd
, pois isso também afetaria o shell pai (interativo).
bash script.sh
chama o script diretamente usando o bash.
./script.sh
está usando o shebang #!/bin/bash
para determinar como executar.
Se você realmente quer saber, qual binário é executado, se você fizer um, bash script.sh
poderá descobrir which bash
.
Portanto, no seu exemplo, não faz diferença. Sim, você deve chmod +x script.sh
poder executá-lo diretamente via ./script.sh
.
/bin/bash
seja o primeiro bash
no seu $PATH
.
#!/bin/bash
só funciona se houver uma/bin/bash
./script.sh
.
Crie um arquivo Delete_Self.sh assim:
#!/bin/rm
echo I am still here!
Execute este script como sh Delete_Self.sh
você verá "Eu ainda estou aqui!" ecoou de volta.
Torne-o executável e execute-o como ./Delete_Self.sh
você verá que nada é repetido, enquanto o arquivo em Delete_Self.sh
si desapareceu.
Então a diferença é que:
bash script.sh
irá ignorar o #! linha, porque o bash é especificado como o programa para executar o script.sh../script.sh
vai ler o #! linha para determinar o programa a ser executado script.sh
.Além das outras respostas, é útil saber a diferença entre executar um script via ./script.sh
(i) e fonte ./script.sh
(ii) - A versão (i) cria um novo shell para executar o comando, enquanto (ii) o executa no shell atual - que pode ser obrigatório se o executável alterar variáveis de ambiente que precisam ser preservadas após a saída do executável. Por exemplo, para ativar um ambiente python conda, o seguinte deve ser usado:
source activate my_env
NB Outra alternativa a source
que você pode encontrar é o .
embutido, ou seja,
. activate my_env