Solución: error "Mal intérprete: no existe tal archivo o directorio" en Linux
Publicado: 2023-05-01dos2unix
, 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.
¿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.
Incluso puede confirmar el problema en una terminal de Linux apuntando el comando file
a su secuencia de comandos.
archivo script1.sh
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
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
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
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).
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.
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".
RELACIONADO: Cómo hacer que su hardware Bash Scripts sea consciente