Non è possibile eseguire un file .sh: / bin / bash ^ M: interprete non valido

71

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 eseguire una procedura standard, ma ho ricevuto 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**

Che cosa significa? Lo stavo facendo come root utente sotto il gruppo root .

Significa che il file non ha l'autorizzazione corretta per l'utente root ?

    
posta user165062 06.06.2013 - 22:17

7 risposte

126

Questo non è un problema di autorizzazione, non stai ricevendo un messaggio 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 di questo tipo: si chiama /bin/bash .

Il ^M è un carattere di ritorno a capo . 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 riga di Windows, il che confonde Linux.

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

sed -i -e 's/\r$//' create_mgw_3shelf_6xIPNI1P.sh
    
risposta data Gilles 06.06.2013 - 22:25
15

In vim potresti anche usare :set ff=unix e quindi salvare il file, o :set ff=dos per ottenere di nuovo la formattazione DOS.

    
risposta data ortang 07.06.2013 - 10:33
9

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

Il CR carattere di controllo aggiuntivo viene mostrato codificato come ^M nel tuo output. Puoi anche vederlo quando esegui cat -A create_mgw_3shelf_6xIPNI1P.sh .

Per convertire le terminazioni di linea dallo stile DOS / Windows allo stile Unix, c'è uno strumento chiamato dos2unix . Si installa utilizzando:

sudo apt-get install dos2unix

Quindi puoi semplicemente convertire le terminazioni di riga 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

Dopo che Bash dovrebbe essere in grado di interpretare il file correttamente.

    
risposta data Byte Commander 15.12.2016 - 21:31
4

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

fromdos file

È disponibile nel pacchetto tofrodos :

sudo apt-get install tofrodos
    
risposta data josediazaz 08.06.2013 - 00:50
3

Fai vi <your script> .

then :set list ; mostrerà uno qualsiasi dei caratteri speciali nel tuo script.

quindi sostituisci il carattere:

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

    
risposta data Pankaj Sain 07.06.2013 - 09:41
2

Puoi anche usare gedit per rimuovere i caratteri indesiderati. Sotto il menu File seleziona Salva come e imposta il tipo di fine riga unix / Linux.

    
risposta data tphistry 03.12.2013 - 03:40
2

Il problema si modifica con Dos!

apri il tuo file con vi quindi imposta unix con:

:set ff=unix
:wq

e tutto bene

    
risposta data DaFreder 28.04.2016 - 18:29

Leggi altre domande sui tag