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?

Milad
fonte
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.

choroba
fonte
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
Guru
fonte
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

shlsy
fonte
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
30

O sourceembutido é um basismo. Escreva isso simplesmente como .alternativa.

por exemplo

. $FILE

# OR you may need to use a relative path (such as in an `npm` script):

. ./$FILE

https://wiki.ubuntu.com/DashAsBinSh#source

Travis Clarke
fonte
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
Mojtaba Yousefi
fonte
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
mah
fonte
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 (.)

GangaRam Dewasi
fonte
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.

Gord Wait
fonte
0

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

sudo -s source ./filename.sh

swati jain
fonte
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
DInfo2019
fonte
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

Kolob Canyon
fonte
-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>
mosu
fonte
5
O post sh: 1: source: not foundnão dizfile not found
Cristian Chaparro A.