La secuencia de comandos Bash siempre imprime “Comando no encontrado”

Cada vez que ejecuto un script usando bash scriptname.sh desde la línea de comandos en Debian, obtengo Command Not found y luego el resultado del script. Entonces, el script funciona, pero siempre hay una instrucción Command Not Found impresa en la pantalla.

Estoy ejecutando el script desde la carpeta /var .

Aquí está el guión:

 #!/bin/bash echo Hello World 

Lo ejecuto escribiendo lo siguiente:

 bash testscript.sh 

ACTUALIZACIÓN: el problema aparece en las líneas en blanco. Cada línea en blanco está dando como resultado un comando no encontrado. ¿Por qué ocurriría esto?

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

 #!/bin/bash 

Ingrese su ruta a bash si no es /bin/bash


Intenta ejecutar:

 dos2unix script.sh 

Que convertirá los finales de línea, etc. de Windows a formato Unix. es decir, elimina \ r (CR) de las terminaciones de línea para cambiarlas de \r\n (CR+LF) a \n (LF) .

Más detalles sobre el comando dos2unix (página man)


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

 cat scriptname.sh | sed 's/\r//' 

La salida se verá algo como esto:

 #!/bin/sh  echo Hello World  

Esto generará el texto completo del archivo con para cada carácter del archivo.

Puede usar bash -x scriptname.sh para rastrearlo.

También encontré un problema similar. El problema parece ser permisos. Si realiza una ls -l , puede identificar que su archivo NO tiene activado el bit de ejecución. Esto NO permitirá que la secuencia de comandos se ejecute. 🙂

Como @artooro agregó en el comentario:

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

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 progtwig que no está en la ruta, no está instalado, mal escrito o algo similar.

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

Si, como dices, son las líneas en blanco las que causan los problemas, es posible que quieras comprobar qué contiene realmente. Correr:

 od -xcb testscript.sh 

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

usa dos2unix en tu archivo de script.

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

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

para ejecutar eso debes proporcionar la ruta completa de eso, por ejemplo

 /home/Manuel/mywrittenscript 

Tenía el mismo problema. Desafortunadamente

 dos2unix winfile.sh bash: dos2unix: command not found 

así que hice esto para convertir.

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

y entonces

 bash unixfile.sh 

Los problemas con la ejecución de scripts también pueden estar relacionados con el mal formateo de los comandos multilínea, por ejemplo, si tiene un carácter en blanco después de la línea “\”. Por ejemplo esto:

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

(tenga en cuenta el espacio adicional después de “\”) causará problemas, pero cuando elimine ese espacio, se ejecutará perfectamente bien.

Esto podría ser trivial y no estar relacionado con la pregunta del OP, pero a menudo me equivoqué al principio cuando estaba aprendiendo scripting

 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) 

También estaba teniendo algo del Cannot execute command . Todo parecía correcto, pero de hecho estaba teniendo un espacio no rompible   justo antes de mi orden, que por supuesto era imposible de detectar a simple vista:

 if [[ "true" ]]; then  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 script Bash comprobamos el problema.

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

 PATH=.:$PATH 

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

En Bash para Windows, intenté ejecutarlo incorrectamente

 run_me.sh 

sin ./ al principio y obtuve el mismo error.

Para las personas con antecedentes de Windows, la forma correcta parece redundante:

 ./run_me.sh 

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 los archivos de su progtwig.