2010-05-15 16 views
15

Pregunta: Me sale este mensaje de error:secuencia de comandos Bash: mala intérprete

exportación: mala intérprete: No existe el fichero o directorio

cuando ejecuto este 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 @ " 

Pero el camino bash parece ser correcto:

[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# 

¿Qué estoy haciendo mal? ¿O es esto un error Lucid Lynx?

hice chmod + x

+0

¿Cómo creó el archivo? ¿La línea termina correctamente? – wlashell

+3

Su nombre de host me hizo reír –

Respuesta

32

La primera línea: #!/Bin/bash

que Linux dónde encontrar el intérprete.

Es muy probable que haya creado este archivo con un editor de Windows, que colocará un <cr><lf> al final de cada línea. Este es el estándar bajo dos/ventanas. Sin embargo, en Unix/Linux, el estándar es simplemente poner un <lf> al final de la línea.

Linux ahora está buscando un archivo llamado /bin/bash<cr> para interpretar el archivo, donde <cr> es un carácter de retorno de carro, que es un personaje de archivo válido en Linux. Tal archivo no existe. De ahí el error.

Solución: Editar el archivo con un editor en Linux y deshacerse del exceso <cr>.

+0

Parcialmente mal. No lo he creado en Windows, utilicé cat> nombre de archivo. dos2unix tampoco lo hace funcionar, pero gvim muestra algunos caracteres inusuales. Copio pegado a un nuevo archivo, sin cambios, y comenzó a funcionar inmediatamente ... –

+2

Nota, creo que nano, emacs y vi _automagically_ strip that. Todo lo que OP tiene que hacer es abrir y guardarlo con cualquiera de los anteriores. –

+0

@Quandary, usando el cliente _what_ ssh/terminal ¿Creó este archivo? ¿Qué tipo de terminal? No he visto este tipo de problema desde la Terminal Virtual de Novell y los entornos 3270. ¿Qué, exactamente usaste para crear el archivo, más allá de 'cat'? ¿Tal vez está utilizando una serie de muerte cerebral -> adaptador TCP/IP? –

8

¿Podría la secuencia de comandos usar Dos nuevas líneas?

Intenta ejecutar dos2unix en él.

+0

No, no lo es, ya ejecuté tofrodos. El problema eran algunos otros personajes, aparte de \ r \ n. Extraño ... –

+0

¿Cuáles fueron estos personajes? – christophetd

0

corriste como este (se ha mencionado chmod + x)

. /path/to/it 

o como esto:

./it 

?

Tengo una sospecha furtiva de que su código se ejecutó en un nuevo proceso, y todo lo que le contó se perdió. Por lo tanto, las variables no se expandirán en su shell actual. Sin embargo, esto no explica el mal intérprete error que ha visto. Creo que también tiene un problema terminal (como en el terminal, con lo que solía hablar al cat).

El hecho de que el indicador no hizo lo que este dijo:

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

Me hace pensar que corría, no procede el código. Hay una diferencia. No pude conseguir lo que publicaste para romper.

+0

Sí, está perdiendo todo porque se está ejecutando en un nuevo proceso. El script necesita abastecimiento (ejecutándose en el mismo proceso) y luego funciona. Sin embargo, el error bash sigue siendo el mismo. –

1

Tenía el mismo problema.Usaron la fuerza bruta:

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

& este hizo el truco

(Por supuesto que me gustaría saber por qué)

2

Parece que las cosas se han configurado para anular la orden interna export de alguna manera. Esto se puede hacer a través de una función exportada o el built-in enable, por ejemplo. Intenta poner type export en la secuencia de comandos para verificar. Si está configurando BASH_ENV, probablemente no debería.

Si bash se llama como sh, se activa el modo POSIX y no permite export a ser anulados con una función, como es requerido por POSIX. Del mismo modo, la mayoría de las otras shells instaladas como /bin/sh siguen POSIX en esto y/o no permiten que el entorno de ejecución de una secuencia de comandos se desordene tan fuertemente como a través de la importación de funciones del entorno.

Por cierto, el script parece diseñado para ser fuente, es decir, . ./mono-2.6-environment en lugar de ./mono-2.6-environment.

+0

Buen punto, necesita abastecimiento. fuente mono-2.6-environment o . ./mono-2.6-ambiente –

0

lo que funcionó para mí fue cuando dos2unix no estaba en el sistema que estaba trabajando con:

sed -i s/{ctrl+v}{ctrl+m}// filename 
Cuestiones relacionadas