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 para que se torne executável?
fonte
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 para que se torne executável?
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 quebash 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 contiverexit
comandos e você o originar, ele poderá desconectá-lo. Um problema menos grave seria se o script fizesse acd
, 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á descobrirwhich bash
.Portanto, no seu exemplo, não faz diferença. Sim, você deve
chmod +x script.sh
poder executá-lo diretamente via./script.sh
.fonte
/bin/bash
seja o primeirobash
no seu$PATH
.#!/bin/bash
só funciona se houver uma/bin/bash
./script.sh
.Crie um arquivo Delete_Self.sh assim:
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 emDelete_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 executadoscript.sh
.fonte
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:NB Outra alternativa a
source
que você pode encontrar é o.
embutido, ou seja,fonte