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?


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.


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

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


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


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

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

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 (.)


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.


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


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

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


-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>

5
Le message dit sh: 1: source: not foundnonfile not found
Cristian Chaparro A.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.