Warum funktioniert #! / Usr / bin / env bash auf meinem System nicht?

10

Ich bin auf einige Probleme gestoßen, als ich einige Installationsskripte ausgeführt habe, über die sie sich beschwert haben bad interpreter.

Also habe ich ein triviales Beispiel gemacht, aber ich kann nicht herausfinden, wo das Problem liegt, siehe unten.

#!/usr/bin/env bash
echo "hello"

Das Ausführen des obigen Skripts führt zu folgendem Fehler

[root@ech-10-24-130-154 dc-user]# ./junk.sh
bash: ./junk.sh: /usr/bin/env: bad interpreter: No such file or directory

Die /usr/bin/envDatei existiert, siehe unten:

[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]#

Wenn ich das Skript so ändere, dass es den regulären Shebang verwendet #!/bin/bash, funktioniert es kein Problem. #!/bin/env bashfunktioniert auch.

Was fehlt in der Umgebung, damit der tragbare Shebang funktioniert?

ls -lL /usr/bin/envkehrt zurück, ls: cannot access /usr/bin/env: No such file or directoryalso muss ich wohl den symbolischen Link ändern? Kann ich darauf hinweisen /bin/env?

env --version ist 8.4 und das Betriebssystem ist Red Hat Enterprise Linux Server Version 6.6.

conorgriffin
quelle
1
Normalerweise liegt das an Wagenrücklauf- / Zeilenvorschubenden auf den Leitungen. Alternativ: Standort von env .
Thomas Dickey

Antworten:

7

ls -lL /usr/bin/envzeigt, dass die symbolische Verknüpfung unterbrochen ist. Das erklärt, warum die Shebang-Zeile nicht funktioniert: Der Kernel versucht und schlägt offensichtlich fehl, eine baumelnde symbolische Verknüpfung auszuführen.

/usr/bin/env -> ../../bin/envist korrekt, wenn /usrund /usr/binbeide tatsächliche Verzeichnisse sind (keine Symlinks). Offensichtlich ist dies auf Ihrer Maschine nicht der Fall. Vielleicht /usrist eine symbolische Verbindung? (Offensichtlich ist es kein symbolischer Link zu /, sonst /usr/bin/envwäre es die gleiche Datei wie /bin/env, kein symbolischer Link).

Sie müssen diesen symbolischen Link reparieren. Sie können es zu einem absoluten Link machen:

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

Sie können es zu einem relativen Link machen, aber wenn Sie dies tun, stellen Sie sicher, dass es korrekt ist. Wechseln Sie zu /usr/binund führen Sie es aus ls -l relative/path/to/bin/env, um zu bestätigen, dass Sie es richtig verstanden haben, bevor Sie den Symlink erstellen.

Dies ist kein Standard-RHEL-Setup, daher müssen Sie etwas lokal geändert haben. Versuchen Sie herauszufinden, was Sie getan haben und ob dies andere ähnliche Probleme verursacht haben könnte.

Gilles 'SO - hör auf böse zu sein'
quelle
Dies ist korrekt, /usr/binwurde in ein anderes Dateisystem verschoben und ist ein symbolischer Link zu/vol_01/usr/bin
conorgriffin
-1

Hier (Fedora 23) /binist eine symbolische Verbindung zu /usr/bin; Wenn Sie ein ähnliches Setup haben, /usr/bin/envkauft Ihnen der symbolische Link von nur eine Endlosschleife.

Überprüfen Sie die entsprechenden Pakete, dh rpm -qf /usr/bin/env /bin/envinstallieren Sie diese neu (hier coreutils, dh yum reinstall coreutilsoder ähnlich). Das sollte jeden fehlgeleiteten Umgang beheben.

vonbrand
quelle
Ich habe bereits neu installiert, coreutilsaber das machte keinen Unterschied. Es ist ziemlich komisch. /usr/bin/envist eine symbolische Verknüpfung mit einem relativen Pfad zum Ziel ../../bin/env. Das sollte also /bin/envdas sein, was es auch gibt. Ich verstehe also nicht, warum diese symbolische Verknüpfung nicht funktioniert. Ich habe das Ziel so ersetzt, dass es /bin/envdurch einen absoluten Pfad zeigt, und das scheint funktioniert zu haben.
Conorgriffin
Wenn /bines sich um eine symbolische Verknüpfung zu /usr/binconorgriffins System handelt, dann /usr/bin/envund /bin/envwäre dieselbe Datei.
Gilles 'SO - hör auf böse zu sein'