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/env
Datei 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 bash
funktioniert auch.
Was fehlt in der Umgebung, damit der tragbare Shebang funktioniert?
ls -lL /usr/bin/env
kehrt zurück, ls: cannot access /usr/bin/env: No such file or directory
also 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.
quelle
Antworten:
ls -lL /usr/bin/env
zeigt, 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/env
ist korrekt, wenn/usr
und/usr/bin
beide tatsächliche Verzeichnisse sind (keine Symlinks). Offensichtlich ist dies auf Ihrer Maschine nicht der Fall. Vielleicht/usr
ist eine symbolische Verbindung? (Offensichtlich ist es kein symbolischer Link zu/
, sonst/usr/bin/env
wä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:
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/bin
und führen Sie es ausls -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.
quelle
/usr/bin
wurde in ein anderes Dateisystem verschoben und ist ein symbolischer Link zu/vol_01/usr/bin
Hier (Fedora 23)
/bin
ist eine symbolische Verbindung zu/usr/bin
; Wenn Sie ein ähnliches Setup haben,/usr/bin/env
kauft Ihnen der symbolische Link von nur eine Endlosschleife.Überprüfen Sie die entsprechenden Pakete, dh
rpm -qf /usr/bin/env /bin/env
installieren Sie diese neu (hiercoreutils
, dhyum reinstall coreutils
oder ähnlich). Das sollte jeden fehlgeleiteten Umgang beheben.quelle
coreutils
aber das machte keinen Unterschied. Es ist ziemlich komisch./usr/bin/env
ist eine symbolische Verknüpfung mit einem relativen Pfad zum Ziel../../bin/env
. Das sollte also/bin/env
das 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/env
durch einen absoluten Pfad zeigt, und das scheint funktioniert zu haben./bin
es sich um eine symbolische Verknüpfung zu/usr/bin
conorgriffins System handelt, dann/usr/bin/env
und/bin/env
wäre dieselbe Datei.