Qual é a diferença entre executar “bash script.sh” e “./script.sh”?

38

Se script.sh é apenas algo típico como

#!/bin/bash
echo "Hello World!"

Existe uma maneira preferida de executar o script? Eu acho que você primeiro tem que chmod-lo para que se torne executável?

    
por user72136 11.06.2014 / 07:31

4 respostas

52

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 executar bash e passar script.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ê.

    
por 11.06.2014 / 07:57
18

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 será executado se você fizer um bash script.sh , você poderá descobrir com which bash .

Então, no seu exemplo, não faz diferença. Sim, você tem que chmod +x script.sh para poder executá-lo diretamente via ./script.sh .

    
por 11.06.2014 / 07:46
1

Além das outras respostas, saber a diferença entre executar um script via ./script.sh (i) e fonte ./script.sh (ii) é útil - A versão (i) cria um novo shell no qual executar o comando , enquanto (ii) executa no shell atual - o que pode ser obrigatório se o executável alterar as variáveis de ambiente que precisam ser preservadas após o executável sair. Por exemplo, para ativar um ambiente python-conda, deve-se usar o seguinte:

source activate my_env

N.B. Outra alternativa para o source que você pode encontrar é o . construído, ou seja,

. activate my_env
    
por 19.05.2017 / 10:21
1

Crie um arquivo Delete_Self.sh assim:

 #!/bin/rm

 echo I am still here!

Execute este script como sh Delete_Self.sh você verá "Ainda estou aqui!" ecoou de volta.

Torne-o executável e execute-o como ./Delete_Self.sh , você verá que nada é retornado, enquanto o arquivo Delete_Self.sh desaparece.

Então a diferença é que:

  • bash script.sh irá ignorar o #! linha, porque o bash é especificado como o programa para executar script.sh.
  • ./script.sh lerá o #! linha para determinar o programa para executar script.sh .
por 18.08.2017 / 03:41