Pourquoi #! / Usr / bin / env bash ne fonctionne pas sur mon système?

11

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/envfichier 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/bashcela ne fonctionne pas. #!/bin/env bashfonctionne aussi bien.

Que manque-t-il à l'environnement pour permettre au shebang portable de fonctionner?

ls -lL /usr/bin/envrenvoie ls: cannot access /usr/bin/env: No such file or directorydonc 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.

conorgriffin
la source
1
Habituellement, cela est dû aux fins de retour chariot / saut de ligne sur les lignes. Alternativement: emplacement d'env .
Thomas Dickey

Réponses:

7

ls -lL /usr/bin/envmontre 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/envest correct si /usret /usr/binsont 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/envserait le même fichier que /bin/env, pas un lien symbolique).

Vous devez corriger ce lien symbolique. Vous pouvez en faire un lien absolu:

sudo ln -snf /bin/env /usr/bin/env

Vous pouvez en faire un lien relatif, mais si vous le faites, assurez-vous qu'il est correct. Basculez vers /usr/binet exécutez ls -l relative/path/to/bin/envpour 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.

Gilles 'SO- arrête d'être méchant'
la source
Ceci est correct, a /usr/binété déplacé vers un autre système de fichiers et est un lien symbolique vers/vol_01/usr/bin
conorgriffin
-1

Ici (Fedora 23) /binest un lien symbolique vers /usr/bin; si vous avez une configuration similaire, le lien symbolique de /usr/bin/envvous achète juste une boucle infinie.

Vérifiez les packages appropriés, c'est-à-dire rpm -qf /usr/bin/env /bin/envet réinstallez-les (ici coreutils, par exemple, yum reinstall coreutilsou similaire). Cela devrait corriger toute mauvaise manipulation.

vonbrand
la source
J'ai déjà réinstallé coreutilsmais cela n'a fait aucune différence. C'est assez bizarre. /usr/bin/envest 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/envun chemin absolu et cela semble avoir fonctionné.
conorgriffin
Si /binun lien symbolique /usr/binsur le système de conorgriffin, alors /usr/bin/envet /bin/envserait le même fichier.
Gilles 'SO- arrête d'être méchant'