Nie ma takiego błędu pliku lub katalogu podczas próby uruchomienia skryptu uruchamiania w Debianie

11

Bardzo nowy w Debianie (Raspbian) i walczę z tym przez kilka dni. Mam skrypt startowy, który chcę wykonać podczas uruchamiania.

Wykonałem następujące polecenia, aby skrypt był wykonywalny i dodać go z domyślnymi parametrami do sekwencji startowej.

sudo chmod 755 /etc/init.d/testsam
sudo update-rc.d testsam defaults

Podczas próby przetestowania skryptu wykonuję następujące czynności:

sudo /etc/init.d/testsam start

Ale kiedy to robię, pojawia się błąd: nie można wykonać /etc/init.d/testsam: Brak takiego pliku lub katalogu.

Zminimalizowałem skrypt do bardzo podstawowego, ale wciąż nie mam pojęcia o prawdziwym przyczynie. Mam nadzieję, że ktoś wskaże mi właściwe rozwiązanie? To jest obecnie skrypt.

#! /bin/bash

# /etc/init.d/testsam

case "$1" in
 start)
        #echo "starting script"
        ;;
 stop)
        #echo "stopping script"
        ;;
 *)
        #echo "Usage: /etc/init.d/testsam {start|stop}"
        exit 1
         ;;
esac

exit 0

Dziękuję za wszelką pomoc

Sam Vanhoutte
źródło

Odpowiedzi:

22

Prawdopodobnie masz znak powrotu karetki ( ^M) na końcu #!linii.

Format #!wiersza jest bardzo ścisły, a zwrot karetki nie jest tam dozwolony, chyba że Twój tłumacz jest rzeczywiście wywołany/bin/bash^M

Nigdy nie będzie powrotu karetki w pliku utworzonym za pomocą odpowiedniego edytora uniksowego, chyba że zrobisz wszystko, aby je dodać.

Podczas edytowania istniejącego pliku, który już używa zakończeń linii CRLF, znaki powrotu karetki mogą być przed tobą ukryte. Na przykład vim to robi. Ale [dos]w wierszu stanu jest również napisane, aby ostrzec, że plik ma format DOS. Następnie możesz powiedzieć :set fileformat=unixi zapisać plik, aby go przekonwertować.


źródło
5
Aby sprawdzić, czy to w rzeczywistości problem, wykonaj następujące czynności cat -v /etc/inti.d/testsam. Jeśli masz błędny zwrot karetki, pojawi się jako ^M.
Jenny D
dziękuję za szybką pomoc! otrzymałem ten plik za pomocą polecenia wget i rzeczywiście był to plik oparty na systemie Windows.
Sam Vanhoutte
Na niektórych serwerach mogłem użyć, dos2unixale co robisz, gdy host nie pozwala, aby to polecenie wyczyściło wszystkie wystąpienia ^M?
user33777,
1
Innym sposobem rozwiązania tego problemu jest:sed -i -e 's/\r//g' /path/file
Al Belsky,