Si, quand j'exécute un script, j'utilise LD_PRELOAD
pour désigner une bibliothèque à précharger, je trouve que la bibliothèque n'est en fait préchargée que si le script a une ligne shebang. Par exemple, étant donné ce script:Pourquoi LD_PRELOAD ne prend-il pas effet avec des scripts n'ayant pas de shebang?
# Not a shebang
echo Hello
et cette commande:
LD_PRELOAD=/path/to/preload_me.so ./script.sh
le script est exécuté sans la bibliothèque étant chargée du tout, que je peux suivre par les effets (non) de son initialisation code.
D'autre part, si j'ajoute une ligne de tralala:
#!/bin/sh
echo Hello
... alors la bibliothèque est chargée quand je lance le script via la même commande. Il ne semble pas important de savoir quel interprète est spécifié; certainement, je peux également utiliser /bin/bash
ou tout autre sh
-famille que j'ai essayé.
Pourquoi existe-t-il une différence, et existe-t-il un moyen de garantir qu'une bibliothèque donnée est préchargée avant une commande shell simple donnée, quelle que soit la commande?
(Adapté de another question dont l'auteur résisté à la question étant formulée en ces termes.)
C'est une bonne réponse, mais je pense que vous devriez préciser qu'elle s'applique spécifiquement à 'bash' (et probablement à d'autres shells).' Dash' ne semble pas le faire, par exemple. (Il exécute le script, mais la précharge prend effet.Tout ce que Posix dit est "le shell doit exécuter une commande équivalente à l'invocation d'un shell avec le chemin d'accès résultant de la recherche en tant que premier opérande", ce qui pourrait s'appliquer à l'un ou l'autre comportement. (Test rapide sur mon système: préchargement de zsh, ksh ne marche pas.) – rici
@rici, la réponse dit explicitement que * 'bash' * forks au lieu d'executer un nouveau shell, mais j'ai quand même ajouté une clarification. –