Solución: error "Mal intérprete: no existe tal archivo o directorio" en Linux

Publicado: 2023-05-01
Persona escribiendo en el mini teclado Cherry KW 9200
Hannah Stryker / Geek de instrucciones
Si obtiene un error de "intérprete incorrecto: no existe tal archivo o directorio" al ejecutar un script de shell, debe convertir su archivo de script de Windows a finales de línea de Unix. Un método es usar el comando dos2unix , así:

dos2unix script1.sh

¿Intentó ejecutar un script de Bash y recibió el mensaje de error "/bin/bash^M: mal intérprete: no existe tal archivo o directorio"? El resultado no es muy útil y casi da la impresión de que falta el script. Afortunadamente, ese no es el caso, y la solución es muy simple.

Tabla de contenido

¿Qué es el error "Mal intérprete: no existe tal archivo o directorio"?
Cómo corregir el error "Mal intérprete: no existe tal archivo o directorio"
Uso del comando dos2unix
Usando el comando tr
Usando el comando sed
Usando vi o vim
Usando Geany
Usando Kate o Kwrite
Usando el Bloc de notas++
Usando el código VS

¿Qué es el error "Mal intérprete: no existe tal archivo o directorio"?

Aparece un mensaje de error que dice /bin/bash^M: bad interpreter: No such file or directory simplemente significa que su archivo de script de shell tiene terminaciones de línea incorrectas: los caracteres colocados al final de una línea indican que es hora de pasar a la Proxima linea. A Windows descendiente de DOS le gusta ver un terminador de "retorno de carro y avance de línea" (CRLF), anotado \r\n . Por el contrario, Linux, macOS moderno y otros sistemas basados ​​en Unix usan solo "avance de línea" (LF) o \n .

Si ve este error de interpretación incorrecto, lo más probable es que usted o la persona de la que obtuvo el script lo escribieron originalmente en una computadora con Windows. Bash ve esos finales de línea \r\n establecidos por la computadora con Windows y se enoja porque impiden que el shell interprete correctamente su script.

Un mensaje de error de "intérprete incorrecto: no existe tal archivo o directorio" en una línea de comando de Linux.

Incluso puede confirmar el problema en una terminal de Linux apuntando el comando file a su secuencia de comandos.

 archivo script1.sh 

Verifique los finales de línea de un archivo con el comando de archivo en Linux.

Si el archivo usa finales de línea DOS, verá el mensaje "con terminadores de línea CRLF" adjunto en la salida. Si nuestra secuencia de comandos hubiera estado usando las nuevas líneas de Unix (LF) adecuadas, no mencionaría terminadores en absoluto. Afortunadamente, volver al negocio de LF es fácil.

Cómo corregir un error de "Mal intérprete: no existe tal archivo o directorio"

Todo lo que se necesita para deshacerse de ese mensaje de error y comenzar a ejecutar sus scripts normalmente es cambiar de los finales de línea de DOS a los finales de línea de Unix. Puede hacer esto con comandos de terminal o en su editor de código favorito. Aquí hay ocho formas de solucionarlo:

Uso del comando dos2unix

Hay un programa de línea de comandos creado solo para convertir archivos de DOS (también conocido como Windows) en archivos totalmente compatibles con Unix, acertadamente llamado dos2unix . Está disponible en la mayoría de los repositorios predeterminados, por lo que puede instalarlo en Ubuntu con:

 sudo apt install dos2unix

En nuestra instalación de Fedora, dos2unix venía preinstalado, pero puede confirmar que lo tiene con:

 sudo dnf instalar dos2unix

En Arch Linux:

 sudo pacman -S dos2unix

Usar dos2unix es simple; solo dale tu nombre de archivo.

 dos2unix script1.sh 

Introduzca el comando dos2unix.

Verifíquelo con file si desea confirmar que la conversión fue exitosa antes de ejecutar su secuencia de comandos. También puede convertir en masa nombrando varios archivos separados solo por un espacio.

 dos2unix secuencia de comandos1.sh secuencia de comandos2.sh secuencia de comandos3.sh

O, si tiene un nombre de archivo consistente, por supuesto puede escribir comandos más cortos usando comodines.

 guion dos2unix*.sh 

Use un asterisco en su comando dos2unix para convertir con un comodín.

El comando dos2unix tiene varios indicadores para ayudarlo a realizar tipos especiales de conversiones, como cambiar la propiedad del archivo. Incluso puede usarlo en forma inversa, unix2dos , si desea volver a CRLF. Ingrese dos2unix --help para obtener más información.

Usando el comando tr

Si no puede o no quiere instalar una utilidad dedicada, Linux tiene herramientas integradas que limpiarán esas nuevas líneas. Con el comando tr , puede eliminar la parte \r de los finales de línea para que nos queden los terminadores \n .

 tr -d '\r' < script1.sh > script1_unix.sh

Aquí, tr toma el texto del archivo script1.sh , elimina cada instancia de \r que encuentra y guarda la salida como el archivo script1_unix.sh .

Usando el comando sed

El poderoso comando sed integrado en su shell también puede cambiar los finales de línea de su archivo.

 sed -i 's/\r//' script1.sh

Si no está familiarizado con la sintaxis sed , le estamos diciendo a sed que edite nuestro archivo ( -i ) y sustituya ( s/ ) cada retorno de carro ( \r ) con nada. Eso nos deja con los terminadores de línea \n preferidos de Unix.

Usando vi o vim

Si usa vi o vim para editar sus scripts, simplemente pase este comando para convertir el archivo actualmente abierto a finales de línea Unix.

 :establecer formato de archivo=unix 

Cambie el formato del archivo de script con un comando vim.

RELACIONADO: Cómo salir del editor Vi o Vim

Usando Geany

Si está trabajando en un entorno de escritorio, no hay razón para perder el tiempo en la terminal solo para preparar sus archivos para el mundo de Unix. Prácticamente todos los editores de código e IDE tienen un conmutador para los finales de línea. Eso incluye a Geany.

Para convertir finales de línea en Geany, vaya a Documento > Establecer finales de línea > Convertir y establecer en LF (Unix).

En Geany, en el menú Documento, vaya a "Establecer finales de línea" y seleccione "Convertir y establecer en LF (Unix)".

Guarde su script e intente ejecutarlo de nuevo.

Usando Kate o Kwrite

Si usa Kwrite para editar su secuencia de comandos, o Kate, la prima más poderosa de Kwrite, puede convertir al formato LF haciendo clic en Herramientas > Fin de línea > Unix.

En Kwrite, en el menú Herramientas, abra "Fin de línea" y seleccione "Unix".

Guarde el archivo y ejecute su script nuevamente.

Usando el Bloc de notas++

Si edita el código en Notepad ++, también puede convertir fácilmente los finales de línea, lo cual es útil porque probablemente lo esté ejecutando en Windows (a menos que haya instalado Notepad ++ para Linux) y puede convertirlos antes de pasar a su sistema Linux. Con el archivo abierto, vaya a Edición > Conversión EOL > Unix (LF).

Asegúrese de guardar su script antes de ejecutarlo.

Si desea que Notepad ++ cree archivos con finales de línea Unix de forma predeterminada, vaya a Configuración> Preferencias, seleccione la pestaña "Nuevo documento" y, en las opciones "Formato (final de línea)", haga clic en el botón de opción "Unix (LF)".

Usando el código VS

Visual Studio Code (VS Code) funciona de la misma manera, solo que la palanca es aún más fácil de encontrar. Simplemente haga clic en "CRLF" en la esquina inferior derecha de la ventana de VS Code.

También puede configurar VS Code para que use finales de línea de Unix de forma predeterminada yendo a Archivo > Preferencias > Configuración y escribiendo eol en la barra de búsqueda de configuración. El resultado superior debe ser un menú desplegable para configurar el "Eol". Cámbielo a "\n".

En la configuración de VS Code, cambie la configuración EOL predeterminada a "\n".

RELACIONADO: Cómo hacer que su hardware Bash Scripts sea consciente