Dlaczego #! / Usr / bin / env bash nie działa w moim systemie?

11

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/envPlik 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/bashnie będzie to działać . #!/bin/env bashdziała również.

Czego brakuje w środowisku, aby przenośny shebang mógł działać?

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

conorgriffin
źródło
1
Zwykle wynika to z zakończeń powrotu karetki / linii na liniach. Alternatywnie: lokalizacja środowiska .
Thomas Dickey,

Odpowiedzi:

7

ls -lL /usr/bin/envpokazuje, ż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/envjest poprawny, jeśli /usri /usr/binoba są rzeczywistymi katalogami (nie dowiązaniami symbolicznymi). Najwyraźniej tak nie jest na twoim komputerze. Może /usrjest to symboliczny link? (Oczywiście nie jest to dowiązanie symboliczne do /, w przeciwnym razie /usr/bin/envbyłby to ten sam plik, co /bin/envnie dowiązanie symboliczne).

Musisz naprawić ten symboliczny link. Możesz zrobić z niego link bezwzględny:

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

Możesz zrobić z niego link względny, ale jeśli tak, upewnij się, że jest poprawny. Przełącz się /usr/bini uruchom, ls -l relative/path/to/bin/envaby 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.

Gilles „SO- przestań być zły”
źródło
To prawda, /usr/binzostał przeniesiony do innego systemu plików i jest dowiązaniem symbolicznym do/vol_01/usr/bin
conorgriffin
-1

Tutaj (Fedora 23) /binjest dowiązaniem symbolicznym /usr/bin; jeśli masz podobną konfigurację, link symboliczny z /usr/bin/envwłaśnie kupuje ci nieskończoną pętlę.

Sprawdź odpowiednie pakiety, tj. rpm -qf /usr/bin/env /bin/envI zainstaluj je ponownie (tutaj coreutils, tj. yum reinstall coreutilsLub podobne). To powinno naprawić wszelkie błędne działania.

vonbrand
źródło
Ponownie zainstalowałem, coreutilsale to nie miało znaczenia. To dość dziwne. /usr/bin/envjest dowiązaniem symbolicznym o względnej ścieżce do celu ../../bin/env. Tak powinno być i to /bin/envró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ł.
conorgriffin
Jeśli byłby /bindowiązaniem symbolicznym do /usr/binsystemu conorgriffin, to /usr/bin/envi /bin/envbyłby to ten sam plik.
Gilles „SO- przestań być zły”