it-swarm.com.de

Bash-Skript: schlechter Interpreter

Frage: Ich bekomme diese Fehlermeldung:

export: Falscher Interpreter: Keine solche Datei oder Verzeichnis

wenn ich dieses Bash-Skript ausführen:

#!/bin/bash
MONO_PREFIX=/opt/mono-2.6
GNOME_PREFIX=/opt/gnome-2.6
export DYLD_LIBRARY_PATH=$MONO_PREFIX/lib:$DYLD_LIBRARY_PATH
export LD_LIBRARY_PATH=$MONO_PREFIX/lib:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=$MONO_PREFIX/include:$GNOME_PREFIX/include
export ACLOCAL_PATH=$MONO_PREFIX/share/aclocal
export PKG_CONFIG_PATH=$MONO_PREFIX/lib/pkgconfig:$GNOME_PREFIX/lib/pkgconfig
PATH=$MONO_PREFIX/bin:$PATH
PS1="[mono-2.6] \w @ "

Der bash-Pfad scheint jedoch korrekt zu sein:

[email protected]:~/sources/mono-2.6# which bash
/bin/bash

[email protected]:~# cd sources/
[email protected]:~/sources# cd mono-2.6/
[email protected]:~/sources/mono-2.6# ./mono-2.6-environment
export: bad interpreter: No such file or directory
[email protected]:~/sources/mono-2.6# ls
download  mono-2.4  mono-2.4-environment  mono-2.6  mono-2.6-environment
[email protected]:~/sources/mono-2.6# cp mono-2.6-environment mono-2.6-environment.sh
[email protected]:~/sources/mono-2.6# ./mono-2.6-environment.sh
export: bad interpreter: No such file or directory
[email protected]:~/sources/mono-2.6# ls
download  mono-2.4-environment  mono-2.6-environment
mono-2.4  mono-2.6              mono-2.6-environment.sh
[email protected]:~/sources/mono-2.6# bash mono-2.6-environment
[email protected]:~/sources/mono-2.6#

Was mache ich falsch? Oder ist das ein Lucid-Lynx-Fehler?

Ich habe chmod + x

17
Stefan Steiger

Die erste Zeile, #!/bin/bash, teilt Linux mit, wo der Interpreter zu finden ist. Das Skript sollte auch mit chmod +x script.sh ausführbar sein, so wie es aussieht.

Es ist sehr wahrscheinlich, dass Sie diese Datei mit einem Windows-Editor erstellt haben, der am Ende jeder Zeile einen <cr><lf> platziert. Dies ist der Standard unter DOS/Windows. OS X wird am Ende jeder Zeile einen <cr> einfügen. Unter Unix/Linux wird jedoch standardmäßig ein <lf> am Ende der Zeile eingefügt.

Linux sucht nun nach einer Datei namens /bin/bash<cr>, um die Datei zu interpretieren, . Dabei ist <cr> ein Wagenrücklaufzeichen, das unter Linux ein gültiges Dateizeichen ist. Eine solche Datei existiert nicht. Daher der Fehler.

Lösung: Bearbeiten Sie die Datei mit einem Editor unter Linux und entfernen Sie den zusätzlichen <cr>. Ein Werkzeug, das normalerweise funktioniert, wenn die Datei unter Windows bearbeitet wird, ist dos2unix.

35
Matthias Wandel

Könnte das Skript Dos-Zeilenumbrüche verwenden?

Versuchen Sie, dos2unix darauf auszuführen.

8
Anton

Es sieht so aus, als ob die Dinge so konfiguriert wurden, dass sie die eingebaute Variable export irgendwie überschreiben. Dies kann beispielsweise über eine exportierte Funktion oder das eingebaute enable erfolgen. Versuchen Sie, type export im Skript zu überprüfen. Wenn Sie BASH_ENV einstellen, sollten Sie dies wahrscheinlich nicht tun.

Wenn bash als sh aufgerufen wird, wird der POSIX-Modus aktiviert, und export darf nicht mit einer Funktion überschrieben werden, wie von POSIX gefordert. Ebenso folgen die meisten anderen als /bin/sh installierten Shells POSIX und/oder erlauben nicht, dass die Ausführungsumgebung eines Skripts so stark durcheinander gebracht wird, wie durch das Importieren von Funktionen aus der Umgebung.

Übrigens scheint das Skript so beschaffen zu sein, dass es als Quelle verwendet wird, d. H. . ./mono-2.6-environment anstelle von ./mono-2.6-environment.

2
jilles

Hatte das gleiche Problem. Verwendete rohe Gewalt:

/bin/sh /full/path/to/configure --options

& das hat den Trick gemacht

(Natürlich würde ich gerne wissen, warum)

1
pol

Dies passiert manchmal, wenn das Dateisystem komisch wird. Versuchen Sie, die Datei zu verschieben oder umzubenennen. Wenn der Fehler "Veraltete Dateihandhabung" angezeigt wird, ist dies Ihr Problem.

z.B. passierte uns mit CentOS Docker

$ ./test.sh 
-bash: ./test.sh: /bin/bash: bad interpreter: Invalid argument
$ ls -alstr test.sh 
20 -r-xr-xr-x 0 omen omen 17874 Jun 20 01:36 test.sh
$ cp test.sh testcopy.sh
$ ./testcopy.sh
Happy Days

$ mv test.sh footest.sh
mv: cannot move ‘test.sh’ to ‘footest.sh’: Stale file handle
$ rm test.sh 
rm: cannot remove ‘test.sh’: Stale file handle

Sie können die Datei kopieren und lesen. Bewegen Sie sie jedoch nicht! Sie können sie auch nicht entfernen. Möglicherweise ist das eine Sache, die ein seltsames Docker-Dateisystem betrifft.

Lösung: Erstellen Sie den Docker-Container OR neu. Möglicherweise hilft die Reparaturdiskette für das Dateisystem ODER natürlich format c: :-D: -o

0
gaoithe

was für mich funktionierte, war, als dos2Unix nicht auf dem System war, mit dem ich arbeitete:

sed -i s/{ctrl+v}{ctrl+m}// filename
0
lathomas64

Haben Sie es so ausgeführt (Sie haben chmod + x erwähnt)

. /path/to/it

oder so:

./it

?

Ich habe den Verdacht, dass Ihr Code in einem neuen Prozess ausgeführt wurde und alles, was Sie gesagt haben, verloren ging. Daher werden Variablen in Ihrer current Shell nicht erweitert. Dies erklärt jedoch nicht den Fehler " bad interpreter ", den Sie gesehen haben. Ich denke, Sie haben auch ein Terminalproblem (wie in Terminal, mit dem Sie früher cat gesprochen haben).

Die Tatsache, dass Ihre Ansage nicht das tat, was dies sagte:

`PS1="[mono-2.6] \w @` "

Lässt mich glauben, Sie liefen nicht den Code. Da ist ein Unterschied. Ich konnte nicht bekommen, was Sie gepostet haben zu brechen.

0
Tim Post