comando source não encontrado no shell sh


147

Eu tenho um script que usa shshell. Eu recebo um erro na linha que usa o sourcecomando Parece que sourcenão está incluído no meu shshell.

Se eu tentar explicitamente executar a sourcepartir do shell, recebo:

sh: 1: source: not found

Devo de alguma forma instalar "fonte"? Eu tenho uma versão errada de sh?


1
Alguém poderia argumentar razoavelmente que um shell que suporta sourceé uma "versão errada".
William Pursell #

1
Além disso, a mensagem de erro source: not foundsignifica que o sourcecomando foi avaliado corretamente, mas o arquivo que ele deveria ter lido não existe.
Simon Richter

4
Não é possível "instalar" source porque é um recurso do shell. Não pode ser implementado como um comando externo.
Christopher Schultz

Respostas:


151

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


2
Obrigado! Substituir / bin / sh por / bin / bash funcionou no Ubuntu! Estou curioso por que, porém, isso significa no Ubuntu bash é sh?
Milad

1
@ Milad: Em recentes Ubuntus, /bin/shchama /bin/dash. Tradicionalmente, /bin/shchamado /bin/bashé o modo de compatibilidade sh.
choroba 4/12/12

@Milad Acho que não funciona no ubuntu 14.04. Qual é a sua versão do sistema operacional?
Reza Ameri

1
Talvez ajude a saber - se você possui scripts em cascata, renomeie todos os "sh -> bash". Obrigado. :-)
BG Bruno

Infelizmente, não foi intuitivo para mim como corrigir esse problema, mas ele me colocou no caminho certo. Eu tive que adicionar SHELL := /bin/bashao topo do meu Makefile.
anon58192932 11/11/19

136

No shell Bourne (sh), use o. comando para originar um arquivo

. filename

Eu realmente não tenho permissão para alterar o script, ele funciona bem em um servidor redhat. Mas nesse servidor, a fonte parece estar incluído no sh
Milad

2
Se tiver source, não é estritamente sh.
tripleee

4
Eu tive esse tipo de problema no Jenkins (tentando obter um arquivo armazenado como "arquivo secreto") e procurar por "." comando foi a solução.
Jan Vlcinsky

Essa deve ser a resposta principal, pois funcionará com sh, dash e bash.
precisa saber é

3
Para compatibilidade com Mac OS (ambiente de desenvolvimento) e Travis-CI (ambiente de teste), eu tive que usar . ./filename. Caso contrário, eu receberia um sh: 1: .: filename: not founderro ao executar testes no Travis-CI.
Adrien Joly

49
$ls -l `which sh`
/bin/sh -> dash

$sudo dpkg-reconfigure dash #Select "no" when you're asked
[...]

$ls -l `which sh`
/bin/sh -> bash

Então vai ficar tudo bem


Agradável! Estou executando servidores RHEL e Ubuntu e sempre tenho pequenos problemas como este no Ubuntu. Eu realmente gosto de RHEL e RHEL como Linux.
Radtek 14/03

A resposta aceita não funciona no Ubuntu 14, esta funciona!
rohithpr

Adicione mais explicações à sua resposta - o que faz? dpkg-reconfigurepode não estar acessível a todos os usuários, especialmente em sistemas que não são baseados no Debian
Nico Haase

Corrigido meus source: not founderros com clientes antigos de telnet após a atualização do debian, obrigado.
bjoster


9

Esse problema ocorre porque o jenkins Execute Shell executa o script por meio de seu / bin / sh

Conseqüentemente, / bin / sh não conhece "origem"

Você só precisa adicionar a linha abaixo na parte superior do Execute Shell em jenkins

#!/bin/bash

Afinal, a questão não está relacionada a Jenkins
Nico Haase

8

O sourcecomando está incorporado em algumas conchas. Se você tiver um script, ele deve especificar qual shell usar na primeira linha, como:

#!/bin/bash

Bem, ele diz #! / Bin / sh e em outro linux, se eu digitar sh manualmente e perguntar "qual fonte" ele me diz: source: shell built-in command
Milad

Ah, então é para isso que serve essa linha. Eu sempre me perguntei. muito obrigado!
CommonSenseCode

5

Eu enfrentei esse erro enquanto tentava chamar o comando source do #Jenkins execute shell.

source profile.txt ou source profile.properties

A substituição do comando de origem é usar,

. ./profile.txt ou . ./profile.properties

Nota: Há um espaço entre os dois pontos (.)


0

Encontrei em um Makefile gnu no Ubuntu, (onde / bin / sh -> bash)

Eu precisava usar o. comando, bem como especificar o script de destino com um prefixo ./ (veja o exemplo abaixo)

source não funcionou nesse caso, não sei por que, uma vez que deveria estar chamando / bin / bash ..

Minha variável de ambiente SHELL também está definida como / bin / bash

test:
    $(shell . ./my_script)

Observe que este exemplo não inclui o caractere de tabulação; teve que formatar para troca de pilha.


0

source é um comando interno do bash. Para executar o comando source, você pode efetuar login como Root.

sudo -s source ./filename.sh


Isso não parece uma solução válida. E se o usuário não tiver permissões de sudo? E o material de origem só estará disponível depois como usuário administrador, o que causará novos problemas
Nico Haase

0

No Ubuntu, em vez de usar sh scriptname.sh para executar o arquivo, usei. scriptname.sh e funcionou! A primeira linha do meu arquivo contém: #!/bin/bash

use este comando para executar o script

.name_of_script.sh

1
Isso já foi respondido várias vezes. Forneça mais informações se você adicionar uma nova resposta nesse caso
Nico Haase

-3

Isso pode ajudá-lo, eu estava recebendo este erro porque estava tentando recarregar o meu .profilecom o comando . .profilee houve um erro de sintaxe


-6

O shell Bourne (sh) usa PATH para localizar source <file>. Se o arquivo que você está tentando fonte não estiver no seu caminho, você receberá o erro 'arquivo não encontrado'.

Experimentar:

source ./<filename>

5
O post sh: 1: source: not foundnão dizfile not found
Cristian Chaparro A.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.