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


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 utilizar el 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.

A "mal intérprete: no existe tal archivo o directorio" mensaje de error en una línea de comandos de Linux.

Incluso puede confirmar el problema en una terminal de Linux señalando el file comando a su script.

file 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 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

Introduzca el comando dos2unix.

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

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

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

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 elige "Convertir y configurar a 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 la 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 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».

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

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





Source link-39