Błąd Bash podczas uruchamiania skryptu

1

Mam 64-bitowy serwer dedykowany CentOS 6.5. Jedyne, co na nim zrobiłem yum install java7, to nie zainstalowałem żadnych innych rzeczy.

Więc w katalogu /rootzrobiłem ten plik ( test.sh)

#!/bin/bash
while true
do
    echo "Hey"
        echo "You have five seconds to do 'Ctrl+C' or the while loop will continue."
    sleep 5
done

Wiem, że nie ma nic złego w kodzie, ponieważ wypróbowałem inne (z oficjalnych stron) i otrzymuję te same błędy.

Więc jeśli to zrobię:

cd /root
bash test.sh

Otrzymuję ten błąd

test.sh: line 7: syntax error near unexpected token `done'
test.sh: line 7: `done'

Jeśli zrobię

cd /root
./test.sh

Otrzymuję ten błąd

-bash: ./test.sh: Permission denied

Próbowałem również zrobić to w katalogu /homei dostaję te same błędy.

PS. Jestem zalogowany jako root za pośrednictwem SSH.

użytkownik3524823
źródło
Co echo $USERmówi Co stat -c '%a' "./test.sh"mówi Twój powyższy kod działa dla mnie. Zapomniałeś chmod +x /root/test.sh?
polym
$ USER mówi „root” stat -c '% a' ”./test.sh” mówi „644”
user3524823
Zapomniałeś dodać flagę wykonywalną. Spójrz na odpowiedź @ slhck poniżej. Czy powyższy kod jest taki sam, jak tutaj wyświetlany? Nie rozumiem, dlaczego pojawia się błąd linii 7.
polym
Dokładnie ten sam kod. Po prostu skopiowałem i wkleiłem, aby sprawdzić dwukrotnie.
user3524823,

Odpowiedzi:

3

Naprawianie uprawnień

Dość pewny, że skrypt nie jest wykonywalny. W tym celu należy ustawić flagę wykonywalną dla bieżącego użytkownika, uruchamiając:

chmod u+x /root/test.sh

Powinieneś być w stanie uruchomić go jako:

cd /root
./test.sh

To znaczy, jeśli obecnie działasz jako root (sprawdź za pomocą whoami).

Jeśli chcesz, aby skrypt mógł być wykonywany przez innego użytkownika w systemie, musi to być chmod og+x(„inni i grupa możliwa do wykonania”), jednak to nie zadziała, jeśli sam skrypt jest zapisany /root, co nie jest możliwe do odczytania przez innych użytkowników niż sam root.

Naprawianie błędów kopiowania i wklejania

Z /bin/bash^Mkomunikatu o błędzie wynika, że linia CRLF systemu Windows kończy się na nim ( \r\n), która powinna być linuksową linią nowej linii ( \n).

Aby to usunąć, możesz uruchomić następujące pliki:

sed -i 's/\r//' test.sh

Albo to:

dos2unix test.sh
slhck
źródło
Kiedy robię ./test.sh pojawia się ten błąd. -bash: ./test.sh: /bin/bash^M: bad interpreter: No such file or directory Zrobiłem „ls” i plik tam był.
user3524823
Wygląda na to, że masz błąd kopiowania i wklejenia w linii mieszania (pierwsza linia w skrypcie). Jakiś nieznany znak na końcu linii. Wymaż go całkowicie, łącznie z początkiem następnego wiersza, i napisz #!/bin/bashponownie.
slhck
Czy to może być przerwa w linii czy coś takiego?
user3524823,
Jestem pewien, że tak. Zaktualizowałem swoją odpowiedź kilkoma instrukcjami, jak się jej pozbyć.
slhck
Dzięki! To teraz działa. ´sed -i 's / \ r //' test.sh´ to zrobiło!
user3524823,