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

107

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 recibí 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 eso? Estaba haciendo esto como rootusuario en el rootgrupo.

¿Significa que el archivo no tiene el permiso correcto para el rootusuario?

usuario165062
fuente

Respuestas:

182

Este no es un problema de permisos, 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 tal archivo: se llama /bin/bash.

El ^Mes un carácter de retorno de carro . Linux usa 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 de Windows, lo que confunde a Linux.

Elimina los personajes espurios de CR. Puedes hacerlo con el siguiente comando:

sed -i -e 's/\r$//' create_mgw_3shelf_6xIPNI1P.sh
Gilles
fuente
22
O instalar y usar el dos2unixprograma.
argentpepper
44
gracias por esto, todas las otras respuestas que he encontrado hasta ahora no han ayudado. Este lo hizo!
qodeninja
no tiene que ser Windows, recibí un mensaje similar después de copiar un script de OS X a Ubuntu ... dos2unix funcionó muy bien en ese caso, mientras que reemplazar '\ r' con nada sería peor, ya que no hay '\ n 'caracteres en el archivo.
Michael
1
@Michael macOS usa \nporque es Unix. ¿El script fue quizás de una versión anterior de Mac OS? Podrías correr sed -i -e 's/\r$/\n/' script.shen ese caso.
wjandrea
1
Ábralo en gedit y, haga Guardar como, y seleccione "Final de línea: Unix / Linux"
Mattmon
23

En vim también puede usar :set ff=unixy luego guardar el archivo, o :set ff=dospara obtener el formato de DOS nuevamente.

Ortang
fuente
este lo hizo por mí, gracias
bunkerdive
19

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

El carácter de control CR adicional se muestra codificado como ^Men su salida. También puedes verlo cuando corres cat -A create_mgw_3shelf_6xIPNI1P.sh.

Para convertir las terminaciones 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á en su lugar:

dos2unix create_mgw_3shelf_6xIPNI1P.sh

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

Byte Commander
fuente
1
Gracias, dos2unix también está disponible para macOS a través de brew.
Muhammad Annaqeeb
5

El problema es que editas con Dos!

abra su archivo con vi y luego configure unix con:

:set ff=unix
:wq

y todo bien

DaFreder
fuente
4

Hacer vi <your script>.

a continuación :set list; mostrará cualquiera de los caracteres especiales en su secuencia de comandos.

luego reemplaza el personaje:

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

Pankaj Sain
fuente
Vea la respuesta anterior sobre el uso de: formato de archivo, que en mi humilde opinión es mejor para manejar esto que la sustitución global. Además, consulte stackoverflow.com/questions/14609779/… para obtener ideas sobre cómo manejarlo automáticamente
qneill
4

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

fromdos file

Está disponible en paquete tofrodos:

sudo apt-get install tofrodos
josediazaz
fuente
2

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

tfistry
fuente
+1 por esto porque me ayudó con las terminaciones de línea de MacOS.
Bobble el