#! / bin / bash - no existe tal archivo o directorio


70

He creado un script bash pero cuando intento ejecutarlo, obtengo

#!/bin/bash no such file or directory

Necesito ejecutar el comando: bash script.shpara que funcione.

¿Cómo puedo arreglar esto?


Tengo este problema ahora bajo cygwin con un script que podría jurar que ya se estaba ejecutando sin problemas. Verifiqué todas las respuestas, pero ninguna parece encajar. Otras preguntas y respuestas también mencionaron problemas de 32/64 bits, pero para los scripts de shell esto podría excluirse, ¿verdad?
ene

Encontrado la razón, añadido detalles en nueva anwer unix.stackexchange.com/a/450389/62636 en caso de que alguien ha utilizado también #!/usr/bin/env bashen lugar de #!/bin/bashexplorar igualmente aquí ...
enero

Respuestas:


100

Este tipo de mensaje generalmente se debe a una línea shebang falsa, ya sea un retorno de carro adicional al final de la primera línea o una lista de materiales al comienzo de la misma.

Correr:

$ head -1 yourscript | od -c

y mira cómo termina.

Esto está mal:

0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n

Esto también está mal:

0000000 357 273 277   #   !   /   b   i   n   /   b   a   s   h  \n

Esto es correcto:

0000000   #   !   /   b   i   n   /   b   a   s   h  \n

Utilizar dos2unix(o sed, tr, awk, perl, python...) para fijar la secuencia de comandos si este es el problema.

Aquí hay uno que eliminará tanto una lista de materiales como las CR de colas:

sed -i '1s/^.*#//;s/\r$//' brokenScript


Tenga en cuenta que el shell que está utilizando para ejecutar el script afectará levemente los mensajes de error que se muestran.

Aquí hay tres scripts que solo muestran su nombre ( echo $0) y tienen las siguientes líneas shebang respectivas:

correctScript:

0000000   #   !   /   b   i   n   /   b   a   s   h  \n

scriptWithBom:

0000000 357 273 277   #   !   /   b   i   n   /   b   a   s   h  \n

scriptWithCRLF:

0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n

En bash, ejecutarlos mostrará estos mensajes:

$ ./correctScript
./correctScript
$ ./scriptWithCRLF
bash: ./scriptWithCRLF: /bin/bash^M: bad interpreter: No such file or directory
$ ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom

Ejecutar los falsos llamando explícitamente al intérprete permite que el script CRLF se ejecute sin ningún problema:

$ bash ./scriptWithCRLF
./scriptWithCRLF
$ bash ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom

Aquí está el comportamiento observado bajo ksh:

$ ./scriptWithCRLF
ksh: ./scriptWithCRLF: not found [No such file or directory]
$ ./scriptWithBom
./scriptWithBom[1]: #!/bin/bash: not found [No such file or directory]
./scriptWithBom

y debajo dash:

$ ./scriptWithCRLF
dash: 2: ./scriptWithCRLF: not found
$ ./scriptWithBom
./scriptWithBom: 1: ./scriptWithBom: #!/bin/bash: not found
./scriptWithBom

2
Otra forma de revelar si este es el problema es hexdump -C yourscript | head -n 1. Todavía lo usaría dos2unix yourscriptpara arreglarlo.
Kevin M

Sí, bien podría ser eso. Edité en Windows. Cosas para la propina.
Nicolas de Fontenay

1
Si se tratara de un problema de CRLF, no vería un #!/bin/bash no such file or directorymensaje de error, ya que no hay razón para que algo intente ejecutarse o abrirse #!/bin/bash. Es /bin/bash<CR>lo que se ejecutaría.
Stéphane Chazelas

1
@StephaneChazelas Como dos2unix solucionó el problema, hay pocas dudas de que no fue un problema de CRLF. El mensaje de error probablemente solo se transcribió de manera incorrecta ..
jlliagre

66
dos2unixtambién elimina una lista de materiales UTF-8. Una lista de materiales UTF-8 podría haber explicado el mensaje de error.
Stéphane Chazelas

17

Esto también puede ser causado por una lista de materiales en un script UTF-8. Si creas el script en Windows, a veces obtienes algo de basura al comienzo del archivo.


La lista de materiales se puede eliminar fácilmente con awk, como en stackoverflow.com/questions/1068650/…
pauxu

1
Tenga en cuenta que Visual Studio para Mac insertará una lista de materiales.
Más claro

9

En realidad, el shebang correcto para el script bash es este:

#!/usr/bin/env bash

Porque, en freeBSD, bash se encuentra en /usr/local/bin/bash


13
"correcto" es una palabra difícil de usar en tales casos. Quizás una mejor frase sería "menos propenso a errores".
HalosGhost

1
Esto también es terrible; la suposición de que / usr existe es una mala IMO. Haiku, por ejemplo, no tiene / usr.
jessicah

9

Puede usar vi para solucionar ambos problemas si existen:

vi <your_file>
:set ff=unix
:set nobomb
:wq

Las respuestas deben ser lo más autónomas posible. La pregunta no menciona dos problemas; Si va a construir sobre otras respuestas, al menos debe decir cuáles son. Mejor aún, debe explicar cómo responde esto a la pregunta.
G-Man

Solución muy rápida sin descargar más herramientas de Windows, ¡gracias!
impulsado por vapor el

1
@ G-Man Otras respuestas ya mencionan esto con mucho mejor detalle de lo que deseo entrar. No es necesario repetir, pero si no es dolorosamente obvio, puede tener un final de línea de Windows y un carácter oculto de la lista de materiales de Windows. Creo que muchas personas que están escaneando respuestas aprecian la brevedad en lugar de ser independientes, especialmente cuando hay muchas más detalles en otras respuestas.
cwash

4

Si no tiene dos2unix, esta es una forma de solucionar este problema.

cp script _p4 && tr -d '\r' < _p4 > script && rm _p4

3

Marca de orden de bytes (BOM)

Esto podría ser causado por una lista de materiales. De Wikipedia, una lista de materiales es un

La marca de orden de bytes (BOM) es un carácter Unicode, marca de orden de bytes U + FEFF (BOM), cuya apariencia como un número mágico al comienzo de una secuencia de texto puede indicar varias cosas a un programa que consume el texto

Desafortunadamente, no indica nada al kernel de Linux que maneja la línea she-bang. Puede verificar que tiene una lista de materiales utilizando file,

file /tmp/foo 
/tmp/foo: UTF-8 Unicode (with BOM) text

O bien, puede hexdump los primeros caracteres y ver si coinciden con alguno de los caracteres BOM manualmente

Puede quitar los caracteres de la lista de materiales una vez que los conozca así,

sed -i '1 s/^\xef\xbb\xbf//' *.txt

0

Tuve el problema al agregar accidentalmente un ejecutable bash incorrecto al PATHy porque en mi script #!/usr/bin/env bashse usó el shebang más flexible (tome el primer ejecutable bash de la ruta).

command -v bash
/cygdrive/c/Program Files/Git/bin//bash

He instalado GIT para Windows para que funcione cygwinjunto con las GUI de Windows GIT (no funcionaba con cygwin native git ...). #!/bin/bashResolví esto ahora cambiando a sheband y eliminando GIT para Windows PATH.


-3

Tratar #!/bin/bash

Segunda cosa: find / -name bash
Tercera cosa:ls -al /bin/bash


O simplemente which bash. Sabemos que está encontrando uno porque está funcionando bash script.sh.
Kevin

Cierto. Y como se mencionó, existe el método mucho más portátil / usr / bin / env para que un programa localice bash (u otro intérprete) para usted. No es necesario codificar un pah.
Hennes
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.