El script Bash imprime "Comando no encontrado" en líneas vacías

111

Cada vez que ejecuto un script bash scriptname.shdesde la línea de comandos en Debian, obtengo Command Not foundy luego el resultado del script.

El guión funciona, pero siempre hay una Command Not Founddeclaración impresa en la pantalla para cada línea vacía. Cada línea en blanco resulta en un comando no encontrado.

Estoy ejecutando el script desde la /varcarpeta.

Aquí está el guión:

#!/bin/bash

echo Hello World

Lo ejecuto escribiendo lo siguiente:

bash testscript.sh

¿Por qué ocurriría esto?

David
fuente
En serio, net está lleno de este tipo de quejas. Shell es un intérprete muy débil y cojo. Poco aquí y allá y falla. Tienes que ver incluso todos los espacios en blanco en el guión. Mi guión estaba fallando debido a un carácter de avance de línea invisible. ¡Probablemente este es solo un lenguaje de secuencias de comandos donde los espacios en blanco cuentan!
Atul
1
Úselo bash -x scriptname.shpara rastrear el error. - En mi caso, era un archivo sh guardado en Windows con VSCode y terminaciones de línea como "CRLF". En VSCode, en la esquina inferior derecha, puede cambiar el terminador de línea de "CRLF" a "LF". Subí este archivo y finalmente pude ejecutarlo con bash scriptname.sh.
Kai Noack
Esto es definitivamente un duplicado de stackoverflow.com/questions/39527571/… pero muchas respuestas aquí explican una serie de otras situaciones en las que obtiene "comando no encontrado" por otras razones. Se recomienda a los visitantes que lean todas las respuestas si su problema no se trata específicamente de líneas vacías.
tripleee

Respuestas:

161

Asegúrate de que tu primera línea sea:

#!/bin/bash

Ingrese su camino a bash si no lo es /bin/bash


Intenta ejecutar:

dos2unix script.sh

Eso convertirá los finales de línea, etc. de Windows al formato Unix. es decir, quita \ r (CR) de los finales de línea para cambiarlos de \r\n (CR+LF)a \n (LF).

Más detalles sobre el dos2unixcomando (página de manual)


Otra forma de saber si su archivo está en formato DOS / Win:

cat scriptname.sh | sed 's/\r/<CR>/'

La salida se verá así:

#!/bin/sh<CR>
<CR>
echo Hello World<CR>
<CR>

Esto generará el texto completo del archivo que se <CR>mostrará para cada \rcarácter del archivo.

chown
fuente
Probablemente no sea necesario ya que lo está ejecutando directamente con bash scriptname.sh(pero sigue siendo una buena práctica, por supuesto).
paxdiablo
1
Hola #! / Bin / bash es la primera línea de mi guión
David
1
@chown: tuve el mismo problema en Mac. Me encontré con esta publicación. No estoy seguro de si ayudó al OP o no. Pero tu solución me ayudó.
Prashant
1
Gracias. Este era exactamente el problema al que me enfrentaba. Estas respuestas lo hicieron funcionar.
slayedbylucifer
5
¿Cómo puede escribir una respuesta a una pregunta de programación mientras conduce?
Omar Tariq
61

Puede utilizar bash -x scriptname.shpara rastrearlo.

pez payaso
fuente
47

También me encontré con un problema similar. El problema parece ser los permisos. Si lo hace ls -l, es posible que pueda identificar que es posible que su archivo NO tenga el bit de ejecución activado. Esto NO permitirá que se ejecute el script. :)

Como @artooro agregó en el comentario:

Para solucionar ese problema, ejecute chmod +x testscript.sh

Lypso345
fuente
4
Para solucionar ese problema, ejecutechmod +x testscript.sh
artooro
Esta fue la respuesta que funcionó para mí. Siempre me dijeron que no tenía permiso, así que lo hice y me dijeron que no se encontró el comando. No pensé en comprobar los permisos.
DiamondDrake
1
Gracias Lypso345, esto resolvió el problema que estaba teniendo.
ammills01
chmod 777 testscript.sh FTW
GeneCode
16

Esto puede ser trivial y no relacionado con la pregunta del OP, pero a menudo me equivoqué al principio cuando estaba aprendiendo a escribir scripts.

VAR_NAME = $(hostname)
echo "the hostname is ${VAR_NAME}"  

Esto producirá una respuesta de "comando no encontrado". La forma correcta es eliminar los espacios

VAR_NAME=$(hostname)
altamont
fuente
11

Si el script hace su trabajo (relativamente) bien, entonces está funcionando bien. Su problema probablemente sea una sola línea en el archivo que hace referencia a un programa que no está en la ruta, no está instalado, está mal escrito o algo similar.

Una forma es colocar un set -xen la parte superior de su secuencia de comandos o ejecutarlo con en bash -xlugar de solo bash: esto generará las líneas antes de ejecutarlas y, por lo general, solo necesita mirar la salida del comando inmediatamente antes del error para ver qué está causando el problema

Si, como usted dice, son las líneas en blanco que causan los problemas, es posible que desee comprobar lo que está convenientemente indicado en ellos. Correr:

od -xcb testscript.sh

y asegúrese de que no haya caracteres divertidos "invisibles" como el CTRL-M(retorno de carro) que puede obtener al usar un editor de tipo Windows.

paxdiablo
fuente
+1 para el comando 'od'! Eso es genial, ¡no sabía nada de eso! ¡Gracias!
chown
11

En Bash para Windows, intenté ejecutar incorrectamente

run_me.sh 

sin ./ al principio y obtuve el mismo error.

Para las personas con antecedentes de Windows, el formulario correcto parece redundante:

./run_me.sh
Michael Freidgeim
fuente
8

utilizar dos2unixen su archivo de script.

bash-o-logist
fuente
6

para ejecutar que debe proporcionar la ruta completa de eso, por ejemplo

/home/Manuel/mywrittenscript
Masood Moghini
fuente
De hecho, al shell no le importan en absoluto las extensiones de archivo. No estoy seguro de que esto merezca que se publique como una respuesta separada.
tripleee
Por supuesto, en el sistema de archivos Linux, al contrario que las extensiones de Windows, se usan simplemente como parte del nombre y no dicen nada sobre el contenido del archivo. No debo decir en mi caso la restricción.
Masood Moghini
6

Si tiene Notepad ++ y recibe este mensaje de error .sh: "comando no encontrado" o este mensaje de error de autoconf "línea 615: ../../autoconf/bin/autom4te: No existe tal archivo o directorio" .

En su Bloc de notas ++, vaya a Editar -> Conversión EOL y luego marque Macinthos (CR) . Esto editará sus archivos. También recomiendo verificar todos los archivos con este comando, porque pronto ocurrirá tal error.

Juniar
fuente
Gracias por esto. Para mi caso, estaba ejecutando un script en la distribución de busybox linux. Tenía el mismo error "no encontrado" en todas las líneas vacías en mis scripts. también tuvo problemas con la declaración if / else. cambiar EOL en Notepad ++ a Unix lo solucionó.
GeneCode
4

Tuvo el mismo problema. Desafortunadamente

dos2unix winfile.sh
bash: dos2unix: command not found

así que hice esto para convertirme.

 awk '{ sub("\r$", ""); print }' winfile.sh > unixfile.sh

y entonces

bash unixfile.sh
Eugene porque
fuente
2

Los problemas con la ejecución de scripts también pueden estar relacionados con el formato incorrecto de los comandos de varias líneas, por ejemplo, si tiene un carácter de espacio en blanco después del salto de línea "\". Por ejemplo, esto:

./run_me.sh \ 
--with-some parameter

(tenga en cuenta que el espacio adicional después de "\") causará problemas, pero cuando elimine ese espacio, funcionará perfectamente.

Marek Wysocki
fuente
0

También estaba tomando algunos de los Cannot execute command. Todo parecía correcto, pero de hecho estaba teniendo un espacio irrompible &nbsp;justo antes de mi comando que, por supuesto, era imposible de detectar a simple vista:

if [[ "true" ]]; then
  &nbsp;highlight --syntax js "var i = 0;"
fi

Que, en Vim, se veía así:

if [[ "true" ]]; then
  highlight --syntax js "var i = 0;"
fi

Solo después de ejecutar el comprobador de scripts Bash shellcheckencontré el problema.

Stefan van den Akker
fuente
shellcheckestá disponible en línea, aunque, por supuesto, debe copiar y pegar su script exactamente para que eso ayude. shellcheck.net
tripleee
0

Me encontré con esto hoy, copiando distraídamente el símbolo del sistema de dólar $(antes de una cadena de comando) en el script.

CNSKnight
fuente
-1

Agregue el directorio actual (.) A PATH para poder ejecutar un script, simplemente escribiendo su nombre, que reside en el directorio actual:

PATH=.:$PATH
Mike Goethals
fuente
1
Esto se considera una vulnerabilidad de seguridad. NO AGREGUE .A SU RUTA.
gniourf_gniourf
Explicación de por qué esta "respuesta" es una mala idea: superuser.com/questions/156582/...
jmng
-1

Es posible que desee actualizar sus archivos .bashrc y .bash_profile con alias para reconocer el comando que está ingresando.

Los archivos .bashrc y .bash_profile son archivos ocultos que probablemente se encuentran en su unidad C: donde guarda sus archivos de programa.

Kean Amaral
fuente