Mensagem de erro 'source: not found' ao executar um script

25

Estou criando um pequeno script de configuração automatizada que modificará /etc/profile e $HOME/.profile se alguns caminhos não forem exportados. Então, eu gostaria de recarregá-los automaticamente.

Eu li que source faz isso, então liguei meu terminal e digitei:

source /etc/profile
source ~/.profile

Do terminal, ele não gerou nenhum erro.

No entanto, colocar esses dois comandos dentro do script Bash resulta em source: not found .

  1. Como posso ter certeza de que o script é executado pelo Bash, mesmo se #!/bin/sh for especificado (aparentemente, não garante isso)?
  2. Por que diria que essas duas fontes não podem ser encontradas quando estão inequivocamente lá?
por Yanick Rochon 30.07.2014 / 15:20

3 respostas

36

/bin/sh não é bash . Para executar seu script com bash , escreva #!/bin/bash como a primeira linha do seu script.

O erro source: not found não foi eliminado, porque /etc/profile não foi encontrado. Ele caiu, porque source não foi encontrado. source é uma função interna do Bash e você não executa o script com bash . Então está claro porque não foi encontrado. Altere a linha #! no script e ela funcionará.

    
por chaos 30.07.2014 / 15:25
8
  

1. Como posso ter certeza de que o script é executado pelo Bash, mesmo que     #!/bin/sh é especificado (aparentemente, não garante)?

Para ter certeza de que um script escrito para sh shell (como no seu caso - veja Qual é a diferença entre #! / bin / sh e #! / bin / bash? ) é executado pelo Bash, apenas execute o seguinte comando:

bash script_name

Assim, você não receberá mais esse erro.

  

2. Por que diria que essas duas fontes não podem ser encontradas quando estão   inequivocamente lá?

Ele não diz que esses arquivos originados não estão lá. Diz que o comando source não foi encontrado. Isso é normal, porque desde que você inicia seu script com #!/bin/sh line, seu script será executado usando sh e não bash como você pode pensar. Por que isso é normal? Porque o comando source é um Bash incorporado, mas não um sh incorporado. Para obter um arquivo em sh , você deve usar . (ponto). Exemplo:

. /etc/profile
. ~/.profile

Outra maneira é mudar a linha shebang para #!/bin/bash como caos disse em sua resposta .

    
por Radu Rădeanu 30.07.2014 / 20:28
4

Veja esta essa pergunta :

  

/bin/sh é geralmente algum outro shell tentando imitar o The Shell. Muitas distribuições usam /bin/bash para sh , ele suporta fonte. No Ubuntu, no entanto, /bin/dash é usado e não suporta fonte. Se você não puder editar o script, tente alterar o shell que o executa.

    
por muru 30.07.2014 / 15:28