Autorisation de script bash refusée et mauvais interprète

8

Je suis sur un kali linux 64 bits.

J'ai créé un script python qui prend 2 arguments pour démarrer. Je ne veux pas taper à chaque fois exactement les mêmes chemins ou rechercher dans l'historique des commandes que j'ai utilisées dans le terminal. J'ai donc décidé de créer un script simple qui appelle le script python avec ses arguments.

#! /bin bash

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

C'est exactement la même commande que j'utiliserais dans le terminal. Cependant, j'obtiens un message d'erreur lorsque j'essaie d'exécuter le fichier de script.

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

wtf.sh a des droits exécutables.

Qu'est-ce qui ne va pas?

Davlog
la source

Réponses:

10

Vous avez un espace au lieu d'une barre oblique ici:

#! /bin bash

Devrait être:

#! /bin/bash

ou simplement

#!/bin/bash

(le premier espace est facultatif). Le shebang ( #!) doit être suivi du chemin vers un exécutable , qui peut être suivi d' un argument , par exemple,

#!/usr/bin/env sh

Dans ce cas, /usr/bin/envc'est l'exécutable; voir man envpour plus de détails.

/binSe réfère simplement à un répertoire.

boucle d'or
la source
putain, idiot moi! Merci! Je n'ai pas vu ça ...
Davlog
1
Vous voudrez peut-être prendre l'habitude d'utiliser #!/bin/sh(au lieu de #!/bin/bash) à moins de savoir que vous utilisez des bashfonctionnalités.
G-Man dit `` Réinstalle Monica ''
@ G-Man Merci d'avoir nettoyé ça un peu. WRT bash vs sh, je suivais simplement le modèle de la question (bien que ma tendance soit de ne l'utiliser que shlorsque je sais que je n'utilise pas les fonctionnalités de bash).
goldilocks
Dans le terminal Ubuntu, which bashest utile. Cela revient /bin/bash. En haut de mon script Bash j'ajoute #!/bin/bash. Ensuite, quand je veux exécuter le script Bash, j'entre bash foo.sh. which shEst donc utilisé de la même manière. sh foo.sh
noobninja
1
@ G-Man, dans le monde du travail, il y a un nombre malheureux de personnes qui ne savent pas si elles utilisent ou non les fonctionnalités de Bash. Dans de nombreux cas, il est préférable de ne pas exécuter un script du tout (car Bash est spécifié dans le shebang mais est manquant) plutôt que d'exécuter et de faire quelque chose d'inattendu (car /bin/shil y a autre chose que Bash et il y a des bashismes inaperçus dans le script). Vois ici.
Wildcard
1

Il est à noter que si le point de montage sur lequel réside votre script a l'attribut 'noexec', vous pouvez alors faire tout ce que vous voulez et cela ne fonctionnera toujours pas, mais invoquer l'interpréteur avec le script comme argument le fera (tant que qui à son tour n'essaie pas d'exécuter un autre script sur un montage noexec).

Splud
la source