web-dev-qa-db-fra.com

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

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

J'ai lu que source fait cela, alors j'ai allumé mon terminal et entré:

source /etc/profile
source ~/.profile

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

Cependant, l'insertion de ces deux commandes dans le script Bash entraîne source: not found.

  1. Comment puis-je être sûr que le script est exécuté par Bash, même si #!/bin/sh est 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à?
29
Yanick Rochon

/bin/sh n'est pas bash. Pour exécuter votre script avec bash, écrivez #!/bin/bash en tant que première ligne de votre script.

L'erreur source: not found n'est pas supprimée, car /etc/profile est introuvable. Il a été supprimé, car source n’a pas été trouvé. source est 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. Modifiez la ligne #! dans le script, et cela fonctionnera.

44
chaos

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

Pour être sûr qu'un script écrit pour sh Shell (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 lorsqu'elles sont incontestablement là?

Il ne dit pas que ces fichiers sourcés ne sont pas là. Il indique que la commande source est introuvable. Ceci est normal car, puisque vous démarrez votre script avec la ligne #!/bin/sh, votre script s'exécutera avec sh et non bash, comme vous pouvez le penser. Pourquoi est-ce normal? Étant donné que la commande source est une commande intégrée Bash, mais non une commande sh. Pour créer un fichier dans sh, vous devez utiliser . (point). Exemple:

. /etc/profile
. ~/.profile

Une autre méthode consiste à modifier la ligne Shebang en #!/bin/bash comme chaos dit dans sa réponse .

8
Radu Rădeanu

Voir ceci SO question :

/bin/sh est généralement un autre shell essayant d'imiter le shell. De nombreuses distributions utilisent /bin/bash pour sh, elle supporte la source. Sur Ubuntu, cependant, /bin/dash est utilisé, mais ne prend pas en charge la source. Si vous ne pouvez pas modifier le script, essayez de modifier le shell qui l’exécute.

4
muru