dos2unix
comando, 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»?
Obteniendo 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 finales de línea incorrectos: los caracteres colocados al final de una línea indican que es hora de pasar a la siguiente línea. A Windows descendiente de DOS le gusta ver un terminador de «retorno de carro y avance de línea» (CRLF), anotado rn
. 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 rn
finales de línea establecidos por la computadora con Windows y se molesta porque impiden que el shell interprete correctamente su script.
Incluso puede confirmar el problema en una terminal de Linux señalando el file
comando a su script.
file 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 hecho solo para convertir archivos de DOS (también conocido como Windows) en archivos totalmente compatibles con Unix llamados acertadamente 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
vino preinstalado, pero puede confirmar que lo tiene con:
sudo dnf install dos2unix
En Arch Linux:
sudo pacman -S dos2unix
Usando dos2unix
es simple; solo dale tu nombre de archivo.
dos2unix script1.sh
Compruébalo 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 script1.sh script2.sh script3.sh
O, si tiene un nombre de archivo consistente, por supuesto puede escribir comandos más cortos usando comodines.
dos2unix script*.sh
El dos2unix
El comando tiene varios indicadores para ayudarlo a realizar tipos especiales de conversiones, como cambiar la propiedad del archivo. Incluso puedes usarlo en forma inversa, unix2dos
, si desea volver a CRLF. Ingresar dos2unix --help
aprender más.
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 tr
comando, puede quitar el r
parte de los finales de línea por lo que nos queda n
terminadores.
tr -d 'r' < script1.sh > script1_unix.sh
Aquí, tr
está tomando el texto de la script1.sh
archivo, eliminando cada instancia de r
encuentra, y guarda la salida como el archivo script1_unix.sh
.
Usando el comando sed
El poderoso sed
El comando 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 sed
sintaxis, estamos diciendo sed
para editar nuestro archivo (-i
) y sustituir (s/
) cada retorno de carro (r
) sin nada. Eso nos deja con el preferido de Unix. n
terminadores de línea.
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.
:set fileformat=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 usar 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 ajustes. 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