J'ai rencontré quelques problèmes lors de l'exécution de certains scripts d'installation dont ils se plaignaient bad interpreter
.
J'ai donc fait un exemple trivial mais je ne peux pas comprendre quel est le problème, voir ci-dessous.
#!/usr/bin/env bash
echo "hello"
L'exécution du script ci-dessus entraîne l'erreur suivante
[root@ech-10-24-130-154 dc-user]# ./junk.sh
bash: ./junk.sh: /usr/bin/env: bad interpreter: No such file or directory
Le /usr/bin/env
fichier existe, voir ci-dessous:
[root@ech-10-24-130-154 dc-user]# ls -l /usr/bin/env
lrwxrwxrwx 1 root root 13 Jan 27 04:14 /usr/bin/env -> ../../bin/env
[root@ech-10-24-130-154 dc-user]# ls -l /bin/env
-rwxr-xr-x 1 root root 23832 Jul 16 2014 /bin/env
[root@ech-10-24-130-154 dc-user]#
Si je modifie le script pour utiliser le shebang normal, #!/bin/bash
cela ne fonctionne pas. #!/bin/env bash
fonctionne aussi bien.
Que manque-t-il à l'environnement pour permettre au shebang portable de fonctionner?
ls -lL /usr/bin/env
renvoie ls: cannot access /usr/bin/env: No such file or directory
donc je suppose que je dois modifier le lien symbolique? Puis-je le signaler /bin/env
?
env --version
est 8.4 et le système d'exploitation est Red Hat Enterprise Linux Server version 6.6.
la source
Réponses:
ls -lL /usr/bin/env
montre que le lien symbolique est rompu. Cela explique pourquoi la ligne shebang ne fonctionne pas: le noyau essaie, et échoue évidemment, d'exécuter un lien symbolique pendant./usr/bin/env -> ../../bin/env
est correct si/usr
et/usr/bin
sont les deux répertoires réels (pas les liens symboliques). Évidemment, ce n'est pas le cas sur votre machine. Peut/usr
- être est-ce un lien symbolique? (Évidemment, ce n'est pas un lien symbolique vers/
, sinon ce/usr/bin/env
serait le même fichier que/bin/env
, pas un lien symbolique).Vous devez corriger ce lien symbolique. Vous pouvez en faire un lien absolu:
Vous pouvez en faire un lien relatif, mais si vous le faites, assurez-vous qu'il est correct. Basculez vers
/usr/bin
et exécutezls -l relative/path/to/bin/env
pour confirmer que vous avez bien compris avant de créer le lien symbolique.Ce n'est pas une configuration RHEL par défaut, vous devez donc avoir modifié quelque chose localement. Essayez de savoir ce que vous avez fait et si cela a pu causer d'autres problèmes similaires.
la source
/usr/bin
été déplacé vers un autre système de fichiers et est un lien symbolique vers/vol_01/usr/bin
Ici (Fedora 23)
/bin
est un lien symbolique vers/usr/bin
; si vous avez une configuration similaire, le lien symbolique de/usr/bin/env
vous achète juste une boucle infinie.Vérifiez les packages appropriés, c'est-à-dire
rpm -qf /usr/bin/env /bin/env
et réinstallez-les (icicoreutils
, par exemple,yum reinstall coreutils
ou similaire). Cela devrait corriger toute mauvaise manipulation.la source
coreutils
mais cela n'a fait aucune différence. C'est assez bizarre./usr/bin/env
est un lien symbolique avec un chemin relatif vers sa cible../../bin/env
. Cela devrait donc exister/bin/env
également. Je ne comprends donc pas pourquoi ce lien symbolique ne fonctionne pas. J'ai remplacé la cible pour qu'elle pointe vers/bin/env
un chemin absolu et cela semble avoir fonctionné./bin
un lien symbolique/usr/bin
sur le système de conorgriffin, alors/usr/bin/env
et/bin/env
serait le même fichier.