No se puede ejecutar un archivo .sh: / bin / bash ^ M: mal intérprete

72

Quería ejecutar un script de shell:

-rwxr-x--x 1 root root   17234 Jun  6 18:31 create_mgw_3shelf_6xIPNI1P.sh

Intenté hacer un procedimiento estándar, pero obtuve este error:

./create_mgw_3shelf_6xIPNI1P.sh 
localhost 389 -l /opt/fews/sessions/AMGWM19/log/2013-06-06-143637_CLA-0 
DEBUG   cd/etc/opt/ldapfiles/ldif_in ;
./create_mgw_3shelf_6xIPNI1P.sh 
localhost 389 -l /opt/fews/sessions/AMGWM19/log/2013-06-06-143637_CLA-0
**ERROR  sh: ./create_mgw_3shelf_6xIPNI1P.sh: /bin/bash^M: bad interpreter: No such file or directory**

¿Qué significa? Lo estaba haciendo como el usuario root en el grupo root .

¿Significa que el archivo no tiene el permiso correcto para el usuario root ?

    
pregunta user165062 06.06.2013 - 22:17

7 respuestas

126

Esto no es un problema de permiso, no recibe un mensaje sobre permisos

/bin/bash^M: bad interpreter: No such file or directory

El script indica que debe ser ejecutado por un shell ubicado en /bin/bash^M . No existe ese archivo: se llama /bin/bash .

El ^M es un carácter de retorno de carro . Linux utiliza el carácter de avance de línea para marcar el final de una línea, mientras que Windows usa la secuencia de dos caracteres CR LF. Su archivo tiene terminaciones de línea en Windows, lo que confunde a Linux.

Elimina los caracteres falsos de CR. Puedes hacerlo con el siguiente comando:

sed -i -e 's/\r$//' create_mgw_3shelf_6xIPNI1P.sh
    
respondido por el Gilles 06.06.2013 - 22:25
15

En vim también puede usar :set ff=unix y luego guardar el archivo, o :set ff=dos para obtener el formato de DOS nuevamente.

    
respondido por el ortang 07.06.2013 - 10:33
10

Su archivo tiene terminaciones de línea estilo DOS / Windows (CR LF) , pero en sistemas tipo Unix solo se utiliza el carácter de control LF como salto de línea.

El CR carácter de control adicional se muestra codificado como ^M en su resultado. También puedes verlo cuando ejecutas cat -A create_mgw_3shelf_6xIPNI1P.sh .

Para convertir los finales de línea del estilo DOS / Windows al estilo Unix, hay una herramienta llamada dos2unix . Lo instalas usando:

sudo apt-get install dos2unix

Luego, simplemente puede convertir las terminaciones de línea de los archivos de ambas maneras usando

dos2unix FILENAME
unix2dos FILENAME

En su caso, simplemente ejecute este comando a continuación y el archivo de script se convertirá in situ:

dos2unix create_mgw_3shelf_6xIPNI1P.sh

Después de eso, Bash debería ser capaz de interpretar el archivo correctamente.

    
respondido por el Byte Commander 15.12.2016 - 21:31
4

Como se explica en las otras respuestas, este es un problema de formato. Entonces, la respuesta es cambiar el formato de DOS a terminaciones de línea de estilo Unix. Esta es otra forma simple de arreglar su archivo 'en su lugar'

fromdos file

Está disponible en el paquete tofrodos :

sudo apt-get install tofrodos
    
respondido por el josediazaz 08.06.2013 - 00:50
3

Do vi <your script> .

luego :set list ; Mostrará cualquiera de los caracteres especiales en su secuencia de comandos.

luego reemplaza el personaje:

:%s/^M//gc [para escribir ^M presione Ctrl + v + m ]

    
respondido por el Pankaj Sain 07.06.2013 - 09:41
2

También puede usar gedit para eliminar los caracteres no deseados. En el menú Archivo, seleccione Guardar como y configure el tipo de fin de línea unix / Linux.

    
respondido por el tphistry 03.12.2013 - 03:40
2

¡El problema es que edites con Dos!

abre tu archivo con vi luego configure Unix con:

:set ff=unix
:wq

y todo bien

    
respondido por el DaFreder 28.04.2016 - 18:29

Lea otras preguntas en las etiquetas