Mensagem de erro 'fonte: não encontrada' ao executar um script

35

Estou criando um pequeno script de instalação automatizada que modificará /etc/profilee $HOME/.profilese alguns caminhos não forem exportados. Em seguida, gostaria de recarregá-las automaticamente.

Eu li sourceisso, então liguei meu terminal e entrei:

source /etc/profile
source ~/.profile

Do terminal, não houve 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/shespecificado (aparentemente, ele não garante)?
  2. Por que diria que essas duas fontes não podem ser encontradas quando estão inconfundivelmente lá?
Yanick Rochon
fonte

Respostas:

54

/bin/shnão é bash. Para executar seu script bash, escreva #!/bin/bashcomo a primeira linha do seu script.

O erro source: not foundnão foi descartado, porque /etc/profilenão foi encontrado. Ele caiu, porque sourcenão foi encontrado. sourceé uma função interna do Bash e você não executa o script bash. Portanto, fica claro por que não foi encontrado. Mude a #!linha no script e ele funcionará.

caos
fonte
9

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

Para ter certeza de que um script escrito para shshell (como no seu caso - consulte Qual é a diferença entre #! / Bin / sh e #! / Bin / bash? ) É executado pelo Bash, basta executar 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 inconfundivelmente lá?

Não diz que esses arquivos de origem não estão lá. Ele diz que o sourcecomando não foi encontrado. Isso é normal, porque desde que você inicia seu script com #!/bin/shlinha, ele será executado usando she não bashcomo você imagina. Por que isso é normal? Porque o sourcecomando é um Bash embutido, mas não um shembutido. Para originar um arquivo sh, você deve usar .(ponto). Exemplo:

. /etc/profile
. ~/.profile

Outra maneira é alterar a linha shebang para #!/bin/bashcomo caos disse em sua resposta .

Radu Rădeanu
fonte
4

Veja esta pergunta SO :

/bin/shgeralmente é outro shell tentando imitar o Shell. Muitas distribuições usam /bin/bashpara sh, ele suporta fonte. No Ubuntu, no entanto, /bin/dashé usado o que não suporta fonte. Se você não pode editar o script, tente alterar o shell que o executa.

muru
fonte
1

Algumas conchas suportam em .vez de source. Então você pode tentar algo assim

. filename

ao invés de

source filename

Espero que funcione

Shivam Agrawal
fonte