Autorizzazione allo script Bash negata & Cattivo interprete

Sono su un kali linux a 64 bit.

Ho creato uno script python che richiede 2 argomenti per iniziare. Non voglio digitare ogni volta gli stessi identici percorsi o cercare nella cronologia dei comandi che ho usato nel terminale. Quindi ho deciso di creare un semplice script che chiama lo script python con i suoi argomenti.

#! /bin bash python CreateDB.py ./WtfPath ./NoWtfPath/NewSystem/ 

È esattamente lo stesso comando che userei nel terminale. Tuttavia, ricevo un messaggio di errore quando cerco di eseguire il file di script.

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

wtf.sh ha diritti eseguibili.

Cosa cè che non va?

Risposta

Qui hai uno spazio invece di una barra:

 #! /bin bash  

Dovrebbe essere:

 #! /bin/bash  

o semplicemente

 #!/bin/bash  

(il primo spazio è opzionale). Lo shebang (#!) deve essere seguito dal percorso di un eseguibile , che può essere seguito da un argomento , ad es.

 #!/usr/bin/env sh  

In questo caso /usr/bin/env è leseguibile; vedi man env per i dettagli.

Solo /bin fa riferimento a una directory.

Commenti

  • dannazione, stupido io! Grazie! ' t visto che …
  • Potresti voler prendere labitudine di usare #!/bin/sh (invece di #!/bin/bash) a meno che tu non sappia che stai utilizzando le bash funzionalità.
  • @ G-Man Grazie per aver pulito questo un po . WRT bash vs. sh, stavo semplicemente seguendo lo schema della domanda (sebbene la mia tendenza sia quella di utilizzare sh solo quando so che ' non utilizzo le funzionalità di bash).
  • Nel terminale Ubuntu, which bash è utile. Ciò restituisce /bin/bash. Nella parte superiore del mio script Bash aggiungo #!/bin/bash. Quindi, quando voglio eseguire lo script Bash, inserisco bash foo.sh. Quindi which sh viene utilizzato allo stesso modo. sh foo.sh
  • @ G-Man, nel mondo di tutti i giorni cè un numero sfortunato di persone che non ' sapere se stanno utilizzando le funzionalità di Bash o meno. In molti casi è ' preferibile che uno script non venga eseguito affatto (perché Bash è specificato nello shebang ma manca) piuttosto che eseguire e fare qualcosa di inaspettato (perché /bin/sh è qualcosa di diverso da Bash e ci sono Bashismi inosservati nello script). Vedi qui.

Risposta

Vale la pena notare che se il punto di montaggio su cui risiede lo script ha lattributo “noexec”, allora puoi mostrare tutto quello che vuoi e comunque non funzionerà, ma invocare linterprete con lo script come argomento (purché che a sua volta non tenta di eseguire un altro script su un montaggio noexec).

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *