web-dev-qa-db-fra.com

Script Bash: mauvais interprète

Question: Je reçois ce message d'erreur:

export: bad interpreter: Aucun fichier ou répertoire de ce type

quand j'exécute ce script bash:

#!/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 @ "

Mais le chemin de la bash semble être correct:

asshat@IS1300:~/sources/mono-2.6# which bash
/bin/bash

asshat@IS1300:~# cd sources/
asshat@IS1300:~/sources# cd mono-2.6/
asshat@IS1300:~/sources/mono-2.6# ./mono-2.6-environment
export: bad interpreter: No such file or directory
asshat@IS1300:~/sources/mono-2.6# ls
download  mono-2.4  mono-2.4-environment  mono-2.6  mono-2.6-environment
asshat@IS1300:~/sources/mono-2.6# cp mono-2.6-environment mono-2.6-environment.sh
asshat@IS1300:~/sources/mono-2.6# ./mono-2.6-environment.sh
export: bad interpreter: No such file or directory
asshat@IS1300:~/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
asshat@IS1300:~/sources/mono-2.6# bash mono-2.6-environment
asshat@IS1300:~/sources/mono-2.6#

Qu'est-ce que je fais mal? Ou est-ce un bug Lucid Lynx?

J'ai fait chmod + x

17
Stefan Steiger

La première ligne, #!/bin/bash, indique à Linux où trouver l'interpréteur. Le script doit également être exécutable avec chmod +x script.sh, ce qui semble être le cas.

Il est fort probable que vous ayez créé ce fichier avec un éditeur Windows, qui placera un <cr><lf> à la fin de chaque ligne. C'est la norme sous dos/windows. OS X placera un <cr> à la fin de chaque ligne. Cependant, sous Unix/Linux, la norme consiste simplement à mettre un <lf> à la fin de la ligne.

Linux cherche maintenant un fichier appelé /bin/bash<cr> pour interpréter le fichier, Où <cr> est un caractère de retour chariot, qui est un caractère de fichier valide sous Linux. Un tel fichier n'existe pas. D'où l'erreur.

Solution: Éditez le fichier avec un éditeur sous Linux et supprimez le <cr> supplémentaire. Un outil qui fonctionne généralement lorsque le fichier est édité sous Windows est dos2unix.

35
Matthias Wandel

Le script peut-il utiliser les nouvelles lignes de Dos?

Essayez d’exécuter dos2unix dessus.

8
Anton

Il semble que les choses aient été configurées pour remplacer la variable export d'une manière ou d'une autre. Cela peut être fait via une fonction exportée ou le enable intégré, par exemple. Essayez de mettre type export dans le script pour vérifier. Si vous définissez BASH_ENV, vous ne devriez probablement pas.

Si bash est appelé en tant que sh, il active le mode POSIX et n'autorise pas le remplacement de export par une fonction, comme requis par POSIX. De même, la plupart des autres shells installés en tant que /bin/sh suivent POSIX et/ou ne permettent pas de fausser l'environnement d'exécution d'un script, mais plutôt en important des fonctions de l'environnement.

Soit dit en passant, le script semble conçu pour provenir de sources, c'est-à-dire . ./mono-2.6-environment au lieu de ./mono-2.6-environment.

2
jilles

Avait le même problème. Force brute utilisée:

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

et cela a fait l'affaire

(Bien sûr, j'aimerais savoir pourquoi)

1
pol

Cela se produit parfois lorsque le système de fichiers devient amusant. Essayez de déplacer ou de renommer le fichier. Si vous voyez l'erreur "Stale file handle", c'est votre problème.

par exemple. nous est arrivé avec docker CentOS

$ ./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

Vous pouvez copier le fichier et le lire. Mais ne le déplacez pas! Ni ne le supprimez. Un système de fichiers bizarre docker peut-être.

Solution: recréer le conteneur de docker OR peut-être qu'une disquette de réparation de système de fichiers aiderait OU bien sûr format c: :-D: -o

0
gaoithe

ce qui a fonctionné pour moi, c’est que dos2Unix n’était pas sur le système sur lequel je travaillais:

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

L'avez-vous exécuté comme ceci (vous avez mentionné chmod + x)

. /path/to/it

ou comme ceci:

./it

?

Je soupçonne furtivement que votre code a été exécuté dans un nouveau processus et que tout ce que vous avez dit a été perdu. Par conséquent, les variables ne seront pas développées dans votre current Shell. Cependant, cela n'explique pas l'erreur mauvais interprète que vous avez vue. Je pense que vous avez également un problème terminal (comme dans terminal, avec quoi vous parliez cat).

Le fait que votre invite n'ait pas fait ce que cela disait:

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

Cela me fait penser que vous avez couru, pas l'origine du code. Il y a une différence. Je ne pouvais pas obtenir ce que vous avez posté à casser.

0
Tim Post