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.
Prueba chmod u+x testscript.sh
Lo sé desde aquí: http://www.linuxquestions.org/questions/red-hat-31/running-shell-script-command-not-found-202062/
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.