Podczas uruchamiania skryptów instalacyjnych, na które się skarżyły, napotkałem pewne problemy bad interpreter
.
Zrobiłem więc trywialny przykład, ale nie mogę zrozumieć, na czym polega problem, patrz poniżej.
#!/usr/bin/env bash
echo "hello"
Wykonanie powyższego skryptu powoduje następujący błąd
[root@ech-10-24-130-154 dc-user]# ./junk.sh
bash: ./junk.sh: /usr/bin/env: bad interpreter: No such file or directory
/usr/bin/env
Plik istnieje, patrz poniżej:
[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]#
Jeśli zmienię skrypt, aby używał zwykłego shebang, #!/bin/bash
nie będzie to działać . #!/bin/env bash
działa również.
Czego brakuje w środowisku, aby przenośny shebang mógł działać?
ls -lL /usr/bin/env
zwraca ls: cannot access /usr/bin/env: No such file or directory
więc myślę, że muszę zmienić link symboliczny? Czy mogę to wskazać /bin/env
?
env --version
jest 8.4, a system operacyjny to Red Hat Enterprise Linux Server wersja 6.6.
shell-script
environment-variables
shebang
conorgriffin
źródło
źródło
Odpowiedzi:
ls -lL /usr/bin/env
pokazuje, że łącze symboliczne jest zerwane. To wyjaśnia, dlaczego linia shebang nie działa: jądro próbuje, i oczywiście nie działa, wykonać wiszące dowiązanie symboliczne./usr/bin/env -> ../../bin/env
jest poprawny, jeśli/usr
i/usr/bin
oba są rzeczywistymi katalogami (nie dowiązaniami symbolicznymi). Najwyraźniej tak nie jest na twoim komputerze. Może/usr
jest to symboliczny link? (Oczywiście nie jest to dowiązanie symboliczne do/
, w przeciwnym razie/usr/bin/env
byłby to ten sam plik, co/bin/env
nie dowiązanie symboliczne).Musisz naprawić ten symboliczny link. Możesz zrobić z niego link bezwzględny:
Możesz zrobić z niego link względny, ale jeśli tak, upewnij się, że jest poprawny. Przełącz się
/usr/bin
i uruchom,ls -l relative/path/to/bin/env
aby potwierdzić, że masz to dobrze przed utworzeniem dowiązania symbolicznego.To nie jest domyślna konfiguracja RHEL, więc musisz coś zmodyfikować lokalnie. Spróbuj dowiedzieć się, co zrobiłeś i czy mogło to spowodować inne podobne problemy.
źródło
/usr/bin
został przeniesiony do innego systemu plików i jest dowiązaniem symbolicznym do/vol_01/usr/bin
Tutaj (Fedora 23)
/bin
jest dowiązaniem symbolicznym/usr/bin
; jeśli masz podobną konfigurację, link symboliczny z/usr/bin/env
właśnie kupuje ci nieskończoną pętlę.Sprawdź odpowiednie pakiety, tj.
rpm -qf /usr/bin/env /bin/env
I zainstaluj je ponownie (tutajcoreutils
, tj.yum reinstall coreutils
Lub podobne). To powinno naprawić wszelkie błędne działania.źródło
coreutils
ale to nie miało znaczenia. To dość dziwne./usr/bin/env
jest dowiązaniem symbolicznym o względnej ścieżce do celu../../bin/env
. Tak powinno być i to/bin/env
również istnieje. Więc nie rozumiem, dlaczego to dowiązanie symboliczne nie działa. Zastąpiłem cel, aby wskazywał na/bin/env
ścieżkę bezwzględną i wydaje się, że zadziałał./bin
dowiązaniem symbolicznym do/usr/bin
systemu conorgriffin, to/usr/bin/env
i/bin/env
byłby to ten sam plik.