Bash Script Permiso denegado y mal intérprete

8

Estoy en un kali linux de 64 bits.

He creado un script de Python que toma 2 argumentos para comenzar. No quiero escribir cada vez exactamente las mismas rutas o buscar en el historial de los comandos que utilicé en la terminal. Así que decidí crear un script simple que llame al script python con sus argumentos.

#! /bin bash

python CreateDB.py ./WtfPath ./NoWtfPath/NewSystem/

Es exactamente el mismo comando que usaría en la terminal. Sin embargo, recibo un mensaje de error cuando intento ejecutar el archivo de script.

bash: ./wtf.sh: /bin: bad interpreter: Permission denied

wtf.sh tiene derechos ejecutables.

¿Qué está mal?

Davlog
fuente

Respuestas:

10

Tienes un espacio en lugar de una barra diagonal aquí:

#! /bin bash

Debiera ser:

#! /bin/bash

o simplemente

#!/bin/bash

(El primer espacio es opcional). El shebang ( #!) debe ser seguido por la ruta a un ejecutable , que puede ser seguido por un argumento , por ejemplo,

#!/usr/bin/env sh

En este caso /usr/bin/enves el ejecutable; ver man envpara más detalles.

Solo se /binrefiere a un directorio.

encerrada dorada
fuente
¡Maldita sea, tonta de mí! ¡Gracias! No vi eso ...
Davlog
1
Es posible que desee adquirir el hábito de usar #!/bin/sh(en lugar de #!/bin/bash) a menos que sepa que está usando bashfunciones.
G-Man dice 'Restablecer a Mónica' el
@ G-Man Gracias por limpiar esto un poco. WRT bash vs. sh, solo estaba siguiendo el patrón de la pregunta (aunque mi tendencia es usar solo shcuando sé que no estoy usando las funciones de bash).
Ricitos
En la terminal de Ubuntu, which bashes útil. Eso vuelve /bin/bash. En la parte superior de mi script Bash agrego #!/bin/bash. Luego, cuando quiero ejecutar el script Bash, entro bash foo.sh. Entonces which shse usa de la misma manera. sh foo.sh
noobninja
1
@ G-Man, en el mundo laboral hay un número desafortunado de personas que no saben si están utilizando las funciones de Bash o no. En muchos casos, es preferible que un script no se ejecute en absoluto (porque Bash se especifica en el shebang pero falta) en lugar de ejecutar y hacer algo inesperado (porque /bin/shes algo diferente a Bash y hay Bashismos inadvertidos en el script). Mira aquí.
Comodín el
1

Vale la pena señalar que si el punto de montaje en el que reside su script tiene el atributo 'noexec', puede cambiar todo lo que quiera y aún no funcionará, pero invocar al intérprete con el script como argumento lo hará (siempre que que a su vez no intenta ejecutar otro script en un montaje noexec).

Splud
fuente