Stworzyłem skrypt bash, ale kiedy próbuję go wykonać, dostaję
#!/bin/bash no such file or directory
Muszę uruchomić polecenie: bash script.sh
aby zadziałało.
Jak mogę to naprawić?
bash
shell-script
executable
shebang
Nicolas de Fontenay
źródło
źródło
#!/usr/bin/env bash
zamiast tego#!/bin/bash
i szukał tutaj ...Odpowiedzi:
Ten rodzaj wiadomości zwykle wynika z fałszywej linii shebang, albo dodatkowego powrotu karetki na końcu pierwszej linii, albo BOM na jej początku.
Biegać:
i zobacz jak to się skończy.
To jest źle:
To też jest złe:
To jest poprawne:
Użyj
dos2unix
(lubsed
,tr
,awk
,perl
,python
...), aby naprawić swój skrypt, czy jest to problem.Oto jeden, który usunie zarówno BOM, jak i tailing CR:
Pamiętaj, że powłoka używana do uruchomienia skryptu nieznacznie wpłynie na wyświetlane komunikaty o błędach.
Oto trzy skrypty pokazujące tylko swoją nazwę (
echo $0
) i posiadające następujące odpowiednie linie shebang:poprawny skrypt:
scriptWithBom:
scriptWithCRLF:
Uruchomienie ich w ramach bash spowoduje wyświetlenie następujących komunikatów:
Uruchamianie fałszywych przez jawne wywołanie interpretera pozwala na uruchomienie skryptu CRLF bez żadnych problemów:
Oto zachowanie zaobserwowane w
ksh
:i poniżej
dash
:źródło
hexdump -C yourscript | head -n 1
. Nadal bym tego użył,dos2unix yourscript
aby to naprawić.#!/bin/bash no such file or directory
komunikatu o błędzie, ponieważ nie ma powodu, aby cokolwiek próbowało się uruchomić lub otworzyć#!/bin/bash
. To,/bin/bash<CR>
co zostanie wykonane.dos2unix
usuwa również BOM UTF-8. LM UTF-8 mógł wyjaśnić komunikat o błędzie.Może to być również spowodowane przez BOM w skrypcie UTF-8. Jeśli tworzysz skrypt w systemie Windows, czasami na początku pliku pojawia się śmieci.
źródło
Właściwie właściwy shebang dla skryptu bash jest następujący:
Ponieważ w FreeBSD bash znajduje się w
/usr/local/bin/bash
źródło
Możesz użyć vi, aby naprawić oba problemy, jeśli istnieją:
źródło
Jeśli nie masz dos2unix, jest to sposób na rozwiązanie tego problemu.
źródło
Znak kolejności bajtów (BOM)
Może to być spowodowane przez BOM. Z Wikipedii BOM to
Niestety, nic nie sygnalizuje jądru Linuksa, który obsługuje linię she-bang. Możesz sprawdzić, czy masz BOM, używając
file
,Możesz też zrzucić hex pierwszych kilka znaków i sprawdzić, czy pasują one do któregokolwiek ze znaków BOM ręcznie
Możesz rozebrać znaki BOM, gdy już je znasz,
źródło
Miałem problem przez przypadkowe dodanie niewłaściwego pliku wykonywalnego bash do
PATH
i ponieważ w moim skrypcie zastosowano bardziej elastyczny#!/usr/bin/env bash
shebang (pobierz pierwszy plik wykonywalny bash ze ścieżki).Zainstalowałem GIT dla Windows, aby współpracował
cygwin
z GUI Windows GIT (nie działał z natywnym gitem Cygwina ...). Rozwiązałem to teraz, przechodząc na#!/bin/bash
sheband i usuwając GIT dla Windows zPATH
.źródło
Próbować
#!/bin/bash
Druga rzecz:
find / -name bash
trzecia rzecz:
ls -al /bin/bash
źródło
which bash
. Wiemy, że to znajduje, ponieważ współpracujebash script.sh
.