commande source introuvable dans sh shell

148

J'ai un script qui utilise le shshell. J'obtiens une erreur dans la ligne qui utilise la sourcecommande. Il semble sourcene pas être inclus dans ma shcoquille.

Si j'essaye explicitement de courir à sourcepartir du shell, j'obtiens:

sh: 1: source: not found

Dois-je en quelque sorte installer "source"? Ai-je une mauvaise version de sh?

Milad
la source
1
On pourrait raisonnablement argumenter qu'un shell qui prend en charge sourceest une "mauvaise version".
William Pursell
1
En outre, le message d'erreur source: not foundsignifie que la sourcecommande a été correctement évaluée, mais que le fichier qu'elle aurait dû lire n'existe pas.
Simon Richter
4
Il n'est pas possible d '«installer» source car c'est une fonctionnalité du shell. Il ne peut pas être implémenté en tant que commande externe.
Christopher Schultz

Réponses:

152

/bin/shest généralement un autre shell essayant d'imiter The Shell. De nombreuses distributions utilisent /bin/bashpour sh, il prend en charge source. Sur Ubuntu, cependant, /bin/dashest utilisé qui ne prend pas en charge source. La plupart des shells utilisent à la .place de source. Si vous ne pouvez pas modifier le script, essayez de changer le shell qui l'exécute.

choroba
la source
2
Merci! Le remplacement de / bin / sh par / bin / bash a fonctionné sur Ubuntu! Je suis curieux de savoir pourquoi, cela signifie-t-il que sur Ubuntu, bash est sh?
Milad
1
@Milad: Sur Ubuntus récent, /bin/shappels /bin/dash. Traditionnellement, on /bin/shappelle le /bin/bashmode de compatibilité sh.
choroba
@Milad Je pense que cela ne fonctionne pas sur ubuntu 14.04. Quelle est votre version de système d'exploitation?
Reza Ameri
1
Peut-être que l'aide est connue - si vous avez des scripts en cascade, renommez tout "sh -> bash". Je vous remercie. :-)
BG Bruno
Ce n'était malheureusement pas immédiatement intuitif pour moi de résoudre ce problème, mais cela m'a mis sur la bonne voie. J'ai dû ajouter SHELL := /bin/bashen haut de mon Makefile.
anon58192932
136

Dans Bourne shell (sh), utilisez le. commande pour rechercher un fichier

. filename
Gourou
la source
Je ne suis pas vraiment autorisé à modifier le script, il fonctionne bien sur un serveur redhat. Mais sur ce serveur, la source semble être incluse dans sh
Milad
2
Si c'est le cas, sourcece n'est pas strictement sh.
tripleee
4
J'ai eu ce type de problème sur Jenkins (en essayant de trouver un fichier stocké en tant que "fichier secret") et de sourcing par "." la commande était la solution.
Jan Vlcinsky
Cela devrait être la meilleure réponse car cela fonctionnera avec sh, dash et bash.
akhan
4
Pour la compatibilité avec Mac OS (environnement de développement) et Travis-CI (environnement de test), j'ai dû utiliser . ./filename. Sinon, j'obtiendrais une sh: 1: .: filename: not founderreur lors de l'exécution des tests sur 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

Alors ce sera OK

timide
la source
Agréable! J'utilise des serveurs RHEL et Ubuntu et j'ai toujours de petits problèmes tels que celui-ci avec Ubuntu. J'aime vraiment RHEL et RHEL comme Linux.
radtek
La réponse acceptée ne fonctionne pas sur Ubuntu 14, celle-ci fonctionne!
rohithpr
Veuillez ajouter quelques explications à votre réponse - que fait-elle? dpkg-reconfigurepeut ne pas être accessible à tous les utilisateurs, en particulier sur les systèmes qui ne sont pas basés sur Debian
Nico Haase
Correction de mes source: not founderreurs avec les anciens clients telnet après la mise à niveau de Debian, merci.
bjoster
31

L' sourceintégré est un bashisme. Écrivez ceci simplement comme à la .place.

par exemple

. $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
la source
9

Ce problème se produit car jenkins Execute Shell exécute le script via son / bin / sh

Par conséquent, / bin / sh ne connaît pas la "source"

Il vous suffit d'ajouter la ligne ci-dessous en haut de votre Execute Shell dans jenkins

#!/bin/bash
Mojtaba Yousefi
la source
La question donnée n'est pas liée à Jenkins après tout
Nico Haase
8

La sourcecommande est intégrée à certains shells. Si vous avez un script, il doit spécifier quel shell utiliser sur la première ligne, par exemple:

#!/bin/bash
mah
la source
Eh bien, il dit #! / Bin / sh et sur un autre linux si j'entre manuellement sh et demande "quelle source" il me dit: source: commande intégrée du shell
Milad
oh alors c'est à ça que servait cette ligne. Je me suis toujours demandé. un immense merci!
CommonSenseCode
5

J'ai rencontré cette erreur alors que j'essayais d'appeler la commande source à partir de #Jenkins execute shell.

source profile.txt ou source profile.properties

Le remplacement de la commande source consiste à utiliser,

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

Remarque: il y a un espace entre les deux points (.)

GangaRam Dewasi
la source
0

J'ai trouvé dans un Makefile gnu sur Ubuntu, (où / bin / sh -> bash)

J'avais besoin d'utiliser le. commande, ainsi que spécifier le script cible avec un préfixe ./ (voir l'exemple ci-dessous)

source ne fonctionnait pas dans cet exemple, je ne sais pas pourquoi car il devrait appeler / bin / bash ..

Ma variable d'environnement SHELL est également définie sur / bin / bash

test:
    $(shell . ./my_script)

Notez que cet exemple n'inclut pas le caractère de tabulation; a dû formater pour l'échange de pile.

Gord Wait
la source
0

la source est une commande intégrée bash donc pour exécuter la commande source, vous pouvez vous connecter en tant que root.

sudo -s source ./filename.sh

swati jain
la source
Cela ne semble pas être une solution valable. Que faire si l'utilisateur ne dispose pas des autorisations sudo? Et le contenu source n'est ensuite disponible qu'en tant qu'utilisateur administrateur, ce qui posera de nouveaux problèmes
Nico Haase
0

Sur Ubuntu, au lieu d'utiliser sh scriptname.sh pour exécuter le fichier, j'ai utilisé. scriptname.sh et cela a fonctionné! La première ligne de mon fichier contient: #!/bin/bash

utilisez cette commande pour exécuter le script

.name_of_script.sh
DInfo2019
la source
1
Cela a déjà été répondu à plusieurs reprises. Veuillez fournir plus d'informations si vous ajoutez une nouvelle réponse dans un tel cas
Nico Haase
-3

Cela peut vous aider, j'obtenais cette erreur car j'essayais de recharger mon .profileavec la commande . .profileet il y avait une erreur de syntaxe

Canyon de Kolob
la source
-6

Bourne shell (sh) utilise PATH pour localiser dans source <file>. Si le fichier que vous essayez de trouver ne se trouve pas dans votre chemin, vous obtenez l'erreur «fichier introuvable».

Essayer:

source ./<filename>
mosu
la source
5
Le message dit sh: 1: source: not foundnonfile not found
Cristian Chaparro A.