Message d'erreur 'source: not found' lors de l'exécution d'un script

35

Je crée un petit script d'installation automatisé qui modifiera /etc/profileet, $HOME/.profilesi certains chemins ne sont pas exportés. Ensuite, j'aimerais les recharger automatiquement.

J'ai lu que sourcefait cela, alors j'ai tiré mon terminal et entré:

source /etc/profile
source ~/.profile

Depuis le terminal, aucune erreur n’a été générée.

Cependant, mettre ces deux commandes dans les résultats de script Bash source: not found.

  1. Comment puis-je être sûr que le script est exécuté par Bash, même si #!/bin/shest spécifié (apparemment, cela ne le garantit pas)?
  2. Pourquoi dirait-on que ces deux sources ne peuvent pas être trouvées lorsqu'elles sont incontestablement là?
Yanick Rochon
la source

Réponses:

54

/bin/shn'est pas bash. Pour exécuter votre script avec bash, écrivez #!/bin/bashcomme première ligne de votre script.

L'erreur source: not foundn'est pas supprimée car /etc/profilenon trouvée. Il est tombé, car sourcen'est pas trouvé. sourceest une fonction intégrée de Bash, et vous n'exécutez pas le script avec bash. On comprend donc pourquoi on ne le trouve pas. Changer la #!ligne dans le script, et cela fonctionnera.

le chaos
la source
9

1. Comment puis-je être sûr que le script est exécuté par Bash, même si #!/bin/shest spécifié (apparemment, cela ne le garantit pas)?

Pour être sûr qu'un script écrit pour shshell (comme dans votre cas - voir Quelle est la différence entre #! / Bin / sh et #! / Bin / bash? ) Est exécuté par Bash, exécutez simplement la commande suivante:

bash script_name

Ainsi, vous n'obtiendrez plus cette erreur.

2. Pourquoi dirait-on que ces deux sources ne peuvent pas être trouvées quand elles sont incontestablement là?

Il ne dit pas que ces fichiers sources ne sont pas là. Il dit que la sourcecommande n'est pas trouvée. Ceci est normal, car puisque vous commencez votre script avec une #!/bin/shligne, votre script s'exécutera en utilisant shet non bashcomme vous le pensez. Pourquoi est-ce normal? Parce que la sourcecommande est une commande intégrée de Bash, mais pas une fonction shintégrée. Pour trouver un fichier sh, vous devez utiliser .(point). Exemple:

. /etc/profile
. ~/.profile

Un autre moyen consiste à modifier la ligne de shebang #!/bin/bashcomme indiqué par le chaos dans sa réponse .

Radu Rădeanu
la source
4

Voir cette question SO :

/bin/shest généralement un autre shell essayant d’imiter The Shell. De nombreuses distributions utilisent /bin/bashpour sh, il supporte la source. Sur Ubuntu, cependant, /bin/dashest utilisé ce qui ne supporte pas la source. Si vous ne pouvez pas éditer le script, essayez de changer le shell qui l’exécute.

muru
la source
1

Certains coquillages soutiennent .au lieu de source. Donc, vous pouvez essayer quelque chose comme ça

. filename

au lieu de

source filename

Esperons que ça marche

Shivam Agrawal
la source