Impossibile eseguire un file .sh: / bin / bash ^ M: interprete errato


107

Volevo eseguire uno script di shell:

-rwxr-x--x 1 root root   17234 Jun  6 18:31 create_mgw_3shelf_6xIPNI1P.sh

Ho provato a fare una procedura standard, ma ho riscontrato questo errore:

./create_mgw_3shelf_6xIPNI1P.sh 
localhost 389 -l /opt/fews/sessions/AMGWM19/log/2013-06-06-143637_CLA-0 
DEBUG   cd/etc/opt/ldapfiles/ldif_in ;
./create_mgw_3shelf_6xIPNI1P.sh 
localhost 389 -l /opt/fews/sessions/AMGWM19/log/2013-06-06-143637_CLA-0
**ERROR  sh: ./create_mgw_3shelf_6xIPNI1P.sh: /bin/bash^M: bad interpreter: No such file or directory**

Cosa significa? Lo stavo facendo come rootutente del rootgruppo.

Significa che il file non dispone dell'autorizzazione corretta per l' rootutente?

Risposte:


182

Questo non è un problema di autorizzazione, non ricevi messaggi sulle autorizzazioni

/bin/bash^M: bad interpreter: No such file or directory

Lo script indica che deve essere eseguito da una shell situata in /bin/bash^M. Non esiste un file simile: si chiama /bin/bash.

La ^Mè un carattere di ritorno . Linux utilizza il carattere di avanzamento riga per contrassegnare la fine di una riga, mentre Windows utilizza la sequenza di due caratteri CR LF. Il tuo file ha terminazioni di linea di Windows, che confondono Linux.

Rimuovi i caratteri CR falsi. Puoi farlo con il seguente comando:

sed -i -e 's/\r$//' create_mgw_3shelf_6xIPNI1P.sh

22
Oppure installa e usa il dos2unixprogramma.
Argentpepper,

4
grazie per questo, tutte le altre risposte che ho trovato finora non mi hanno aiutato. Questo l'ha fatto!
qodeninja,

non deve essere Windows, ho ricevuto un messaggio simile dopo aver copiato uno script da OS X a Ubuntu ... dos2unix ha funzionato alla grande in quel caso, mentre sostituire "\ r" con niente sarebbe peggio, dato che non ci sono "\ n 'caratteri nel file.
Michael,

1
@Michael macOS usa \nperché è Unix. Lo script proveniva forse da una versione precedente di Mac OS? Potresti correre sed -i -e 's/\r$/\n/' script.shin quel caso.
wjandrea,

1
Aprilo in gedit e, fai Salva con nome, e seleziona "Fine riga: Unix / Linux"
Mattmon,

23

In vim è anche possibile utilizzare :set ff=unixe quindi salvare il file o :set ff=dosottenere nuovamente la formattazione DOS.


questo è stato per me, grazie
bunkerdive,

19

Il tuo file ha terminazioni di riga di stile DOS / Windows (CR LF) , ma su sistemi simili a Unix viene utilizzato solo il carattere di controllo LF come interruzione di riga.

Il carattere di controllo CR aggiuntivo viene mostrato codificato come ^Mnell'output. Puoi anche vederlo quando corri cat -A create_mgw_3shelf_6xIPNI1P.sh.

Per convertire le terminazioni di linea dallo stile DOS / Windows allo stile Unix, esiste uno strumento chiamato dos2unix. Lo installi usando:

sudo apt-get install dos2unix

Quindi puoi semplicemente convertire i finali di linea dei file in entrambi i modi usando

dos2unix FILENAME
unix2dos FILENAME

Nel tuo caso, esegui semplicemente questo comando di seguito e il file di script verrà convertito sul posto:

dos2unix create_mgw_3shelf_6xIPNI1P.sh

Dopodiché Bash dovrebbe essere in grado di interpretare correttamente il file.


1
Grazie, dos2unix è disponibile anche per macOS tramite brew.
Muhammad Annaqeeb,

5

Il problema si modifica con Dos!

apri il tuo file con vi quindi imposta unix con:

:set ff=unix
:wq

e tutto bene


4

Fare vi <your script>.

quindi :set list; mostrerà uno dei caratteri speciali nella tua sceneggiatura.

quindi sostituire il personaggio:

:%s/^M//gc [per digitare ^Mpremere Ctrl+ v+ m]


Vedi la risposta sopra sull'uso di: fileformat che è meglio di IMHO per gestire questo rispetto alla sostituzione globale Inoltre, vedi stackoverflow.com/questions/14609779/… per idee su come gestire automaticamente
qneill

4

Come spiegato nelle altre risposte, si tratta di un problema di formato. Quindi, la risposta è cambiare il formato da DOS a terminazioni di linea in stile Unix. Questo è ancora un altro modo semplice per sistemare il tuo file "sul posto"

fromdos file

È disponibile nel pacchetto tofrodos:

sudo apt-get install tofrodos

2

Puoi anche usare gedit per rimuovere i personaggi indesiderati. Nel menu File selezionare Salva con nome e impostare il tipo di fine riga unix / Linux.


+1 per questo perché mi ha aiutato con le terminazioni di linea di MacOS.
Bobble
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.