Zły błąd interpretera podczas wykonywania skryptu powłoki z poprawną linią shebang

3

Podczas wykonywania skryptu ze ścieżki (nazwa skryptu, a nie „nazwa skryptu”) pojawia się następujący błąd:

-bash: ./gitup: / bin / bash /: bad interpreter: nie katalog

Wszystkie pozostałe skrypty w tym samym katalogu są wykonywane bez problemu i nie napotykam tego problemu, gdy skrypt jest uruchamiany ręcznie (sh scriptname), tylko gdy jest wykonywany samodzielnie. Zatem sam skrypt wydaje się nie być problemem, ponieważ wykonuje się normalnie i robił to, dopóki nie otworzyłem nowej sesji powłoki i nie natrafiłem na ten błąd tylko dla tego skryptu.

Skrypt jest wykonywalny, zawiera wszystkie wymagane linie do wykonania w sposób opisany przeze mnie (działał poprawnie do dzisiaj) i może zostać wykonany przez mojego użytkownika, więc nie jestem pewien, na czym polega problem.

Linia shebang brzmi #! / Bin / bash. Użyłem polecenia „export PATH = $ PATH: repo / utilities „skierować do katalogu przechowującego te skrypty, z których wszystkie, oprócz tego, wykonują po prostu wywołując nazwę skryptu (np. gitup).

tony_perkis666
źródło
3
Czy mógłbyś dołączyć przynajmniej pierwszą linię ( linia shebang ) twojego skryptu i polecenia, którego używasz, aby to nazwać? Powiedziałeś, że jest na twojej drodze, a mimo to nazywasz to ./gitup. Czy na pewno uruchamiasz skrypt, który Twoim zdaniem jest?
terdon

Odpowiedzi:

2

Jest kilka rzeczy, o których mogę pomyśleć.

  1. Powiedziałeś, że twój skrypt znajduje się w twojej $ PATH, ale nazywasz go pełną ścieżką ( ./gitup w przeciwieństwie do sprawiedliwego gitup ). Czy to możliwe, że edytowałeś jedną wersję skryptu (powiedzmy w twoim $ PATH ~/bin/gitup ), a następnie wykonałem inny ( ./gitup )?

  2. Czy w twoim pliku PATH $ może być wiele wersji? Możesz to sprawdzić

    which -a gitup
    
  3. Być może podczas edycji skryptu przypadkowo wprowadziłeś dziwny niewidzialny znak. Sprawdź za pomocą linii shebang od:

    head -1 ./gitup | od -c
    

    Upewnij się, że nic nie ma #!/bin/bash ale znak nowej linii ( \n ). To powinno wyglądać tak:

    0000000   #   !   /   b   i   n   /   b   a   s   h  \n
    0000014
    
terdon
źródło
Dziękuję Ci. Wygląda na to, że do tego samego skryptu było wiele ścieżek.
tony_perkis666
Widziałem to także, gdy system plików jest zabawny. Mogłem przeczytać plik w porządku. Spróbuj przenieść lub zmienić nazwę pliku. Jeśli widzisz błąd „Stale file handle”, jest to twój problem.
gaoithe
@gaoithe stary plik uchwytu jest zupełnie innym błędem zwykle związanym z brakiem poprawnych wartości i-węzłów. Nie rozumiem, jak to jest tutaj istotne.
terdon
@terdon jest istotny, ponieważ „/ bin / bash /: bad interpreter:” był dokładnie błędem, który dostałem podczas uruchamiania skryptu. Mogłem przeczytać skrypt. Mógłbym to zrobić. Uprawnienia wyglądały dobrze. Po prostu nie mogłem go uruchomić. Jeśli skopiowałem skrypt na nową nazwę, wszystko działało poprawnie. Kiedy próbowałem użyć mv lub rm, zobaczyłem plik „Stale file handle”. Umieściłem tutaj moje doświadczenie: stackoverflow.com/questions/2841593/bash-script-bad-interpreter/…
gaoithe
1
@gaoithe huh, to ciekawe. Jeśli zobaczysz to ponownie, byłoby wspaniale, gdybyś mógł zadać pytanie na ten temat, zarówno tutaj, jak i dalej Unix i Linux . Uważam to za bardzo zaskakujące i zastanawiam się, jak mogło się to stać. Może ma to coś wspólnego z faktem, że był w kontenerze dokowania? Dziwny.
terdon
1

Sprawdź shebang ( #! ) linia, upewnij się, że to mówi

#!/bin/bash

i nie

#!/bin/bash/

Jeśli wygląda na drugi przykład, zmień go na pierwszy.

EDYTOWAĆ (w odpowiedzi na to komentarz)

Jeśli jest to ograniczone tylko do jednego skryptu, utwórz kopię tego skryptu i zacznij usuwać z niego kod, a następnie utwórz minimalny skrypt, który nadal pokazuje ten problem. Następnie dodaj ten minimalny skrypt.

BenjiWiebe
źródło
Pomyślałem, że na początku i zweryfikowałem, że używa: #! / Bin / bash, dlatego jestem tym zaskoczony.
tony_perkis666
@josephmarhee Is /bin/bash dowiązanie symboliczne do /bin/bash/? Robi /bin/bash istnieć? Czy twój system jest aktualny (dziwny błąd)?
BenjiWiebe
Nie wydaje się, aby był dowiązany symbolicznie, ale istnieje / bin / bash; to wydaje się ograniczone tylko do jednego skryptu, ale nic w skrypcie nie wydaje się być problemem. Uruchomię aktualizację i zobaczę, co z tego wynika. Dzięki.
tony_perkis666
@josephmarhee Zobacz moją edycję
BenjiWiebe
Dziękuję Ci. Zamieszam skrypt i zobaczę, co z tego wyniknie. Jest prawdopodobne, że gdzieś tam, gdzieś tam zostało edytowane, więc mam nadzieję, że tak jest.
tony_perkis666