Script shell UNIX / solaris shebang dans le fichier include

J’ai un script functions.sh avec un tas de fonctions globales que je veux utiliser dans d’autres scripts. ce script de fonctions est écrit en bash (#! / bin / bash)

Ces nombreux scripts avaient été écrits au fil des ans, donc les plus anciens ou avec le #! / Bin / sh (ce qui est différent de #! / Bin / bash dans solaris).

Ma question est la suivante: lorsque vous appelez le fichier functions.sh (avec. /Path/to/functions.sh) depuis un script sh (pas bash), la ligne shebang de “functions.sh” est-elle interprétée?

En un mot, pouvez-vous appeler un script de fonction écrit bash à partir d’un autre script de type shell (avec des lignes de shebang appropriées dans les deux)?

Merci !

Tant que vous voulez utiliser la fonction, vous devez vous procurer les scripts et ne pas les exécuter .

source /path/to/functions.sh 

ou selon les normes POSIX , faire

 . ./path/to/functions.sh 

à partir du script sh , ce qui équivaut à inclure le contenu de function.sh dans le fichier à l’endroit où la commande est exécutée.

Vous devez comprendre la différence entre le sourcing et l’exécution d’un script.

  • Sourcing exécute le script à partir du shell parent dans lequel le script est appelé; toutes les variables d’environnement, les fonctions sont conservées jusqu’à ce que le shell parent soit terminé (le terminal est fermé ou les variables sont réinitialisées ou non définies),

  • Exécutez une nouvelle shell à partir du shell parent et ces variables, les fonctions, y compris vos variables d’exportation, ne sont conservées que dans l’environnement du sous-shell et détruites à la fin du script.

Lorsque vous générez un fichier, le shebang de ce fichier est ignoré (il ne se trouve pas sur la première ligne car il est inclus dans le script de l’appelant et est considéré comme un commentaire). Lorsque vous incluez un ancien script avec #!/bin/sh il sera traité comme le shell de l’appelant. La plupart des choses écrites dans /bin/sh fonctionneront dans bash .
Lorsque vous exécutez un script sh ou ksh et que vous incluez ( source ) un fichier bash, tout code spécifique à bash donnera des problèmes.