bash fehler?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Hallo

bash: ./start.sh: /bin/bash^M: Defekter Interpreter: Datei oder Verzeichnis nicht gefunden

zeig doch mal:

cat start.sh

Damit wir uns ein Bild davon machen können wie das Script arbeitet bzw. arbeiten soll.

was ist da der Fehler?

Da steht "defekter Interpreter"; es sollte aber in der ersten Zeile stehen:

#!/bin/bash

ohne Leerzeichen oder etwas wegzulassen. Du kannst auch die Angabe des Interpeters ganz weglasen und das Script so starten:

bash start.sh

Dann wäre es egal ob die Datei eine Angabe macht und ob die Datei ausführbar ist, weil Du ja den Interpreter (die bash) selbst startest.

Linuxhase

Woher ich das weiß:eigene Erfahrung – Ich benutze seit 2007 Linux und habe LPIC101 und LPIC102

mit  cat start.sh wird man da nicht weiter kommen, denn viele Editoren oder Anzeigeprogramme benutzen die Kombination 0d0aH wie 0dH.
Sicherheit schafft da nur z.B. ein Hex-Editor wie ghex.

bash start.sh wird dann vielleicht die 1. Zeile überspringen, sollte dann aber schon die nächste Zeile als Fehler interpretieren.

0

root@5825c732c828f5 lobby $ cat start.sh
#!/bin/bash

BINDIR=$(dirname "$(readlink -fn "$0")")
cd "$BINDIR"

while true
do
java -server -Xms1024M -Xmx1024M -jar spigot-1.8.8.jar

echo -e 'If you want to completely stop the server process now, press STRG-C before the\ntime is up!'
echo "Rebooting in:"
for i in 5 4 3 2 1
do
echo "$i...

0
@Mrciller2

@guenterhalt

mit  cat start.sh wird man da nicht weiter kommen

Dann halt mit:

cat -E
# und/oder
cat -T

Aber selbst dafür sind Code-TAGs nötig. ;-)

@Mrciller2

Das ging an Dich, denn so wäre es besser gewesen:

#!/bin/bash 
BINDIR=$(dirname "$(readlink -fn "$0")")
cd "$BINDIR"

while true
do
java -server -Xms1024M -Xmx1024M -jar spigot-1.8.8.jar

echo -e 'If you want to completely stop the server process now, press STRG-C before the\ntime is up!'
echo "Rebooting in:"

for i in 5 4 3 2 1
do
echo "$i...

Und schon sieht man das da etwas fehlt.

  • Wenn ein do da steht muss es auch mit done enden.
  • Ebenso muß ein for mit done enden.
  • Und statt cd "$BINDIR" würde ich cd ${BINDIR} nehmen

Was man leider nicht sieht sind die Zeilenenden :-(

Schreib halt das Script mit einem unixoiden Texteditor ab und speichere es in eine neue Datei.

#!/bin/bash 
BINDIR=$(dirname "$(readlink -fn "$0")")
cd ${BINDIR}

while true
do
java -server -Xms1024M -Xmx1024M -jar spigot-1.8.8.jar
echo -e "If you want to completely stop the server process now, press STRG-C before the\ntime is up!"
echo "Rebooting in:"
done

for i in 5 4 3 2 1
do
echo ${i}
done
exit 1

Aber auch so macht das Ganze gar keinen Sinn. Ein sauber neu geschriebenes Script muss hier her.

Linuxhase

0

das ist kein bash-Fehler. Du hast mit 100% Sicherheit die Datei mit einem Windows-Editor bearbeitet und dann in das Linux-System übernommen.

Innerhalb eines Computers passiert so etwas kaum noch, denn die Tools erkennen das selbst.
Bei Übertragungen mit ftp und der Option "bin" wird  jedes Byte übertragen, so auch die "Microsoft-Zeilen-Ende-Kennung".
Mit der Option "ascii" ist das  anders. Beide FTP-Programme (Sender + Empfänger) wissen dann, was zu tun ist.

Woher ich das weiß:Berufserfahrung – openSuSE seit 1995

Falsche Zeilenendemarkierungen in dem Script (wahrscheinlich im "Windows"-Format abgespeichert, also mit "carriage return + line feed").