219

I wanted to execute a shell script:

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

I tried to do a standard procedure, but I got this error:

./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**

What does it mean? I was doing this as the root user under the root group.

Does it mean that the file does not have the correct permission for the root user?

edwinksl
  • 24,109
user165062
  • 2,253
  • 3
  • 15
  • 6

8 Answers8

366

This isn't a permission issue, you aren't getting a message about permissions

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

The script indicates that it must be executed by a shell located at /bin/bash^M. There is no such file: it's called /bin/bash.

The ^M is a carriage return character. Linux uses the line feed character to mark the end of a line, whereas Windows uses the two-character sequence CR LF. Your file has Windows line endings, which is confusing Linux.

Remove the spurious CR characters. You can do it with the following command:

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

In vim you could also use :set ff=unix and then save the file, or :set ff=dos to get DOS formatting again.

ortang
  • 2,183
  • 14
  • 13
46

Your file has DOS/Windows style line endings (CR LF), but on Unix-like systems only the LF control character is used as line break.

The additional CR control character is shown encoded as ^M in your output. You can also see it when you run cat -A create_mgw_3shelf_6xIPNI1P.sh.

To convert the line endings from DOS/Windows style to Unix style, there's a tool called dos2unix. You install it using:

sudo apt-get install dos2unix

Then you can simply convert files' line endings in both ways using

dos2unix FILENAME
unix2dos FILENAME

In your case, simply run this command below and the script file will be converted in-place:

dos2unix create_mgw_3shelf_6xIPNI1P.sh

After that Bash should be able to interpret the file correctly.

Byte Commander
  • 110,243
20

The Problem ist you edit with Dos!

open your file with vi then set unix with:

:set ff=unix
:wq

and it all fine

muru
  • 207,228
DaFreder
  • 201
7

As explained in the other answers, this is a format issue. So, the answer is to change the format from DOS to Unix style line endings. This is yet another simple way to fix your file 'in place'

fromdos file

It's available in package tofrodos:

sudo apt-get install tofrodos
Byte Commander
  • 110,243
josediazaz
  • 71
  • 1
6

Do vi <your script>.

then :set list; it will display any of the special characters in your script.

then replace the character:

:%s/^M//gc [to type ^M press Ctrl + v + m]

strugee
  • 1,092
5

You can also use gedit to remove the unwanted characters. Under the File menu select Save As and set the line end type unix/Linux.

Seth
  • 59,332
0

I had developed the bash script on a Mac, so the first line of the script was

#!/opt/homebrew/bin/bash

When I tried to run it on ubuntu, I got the bad-interpreter issue. I changed the first line to

/usr/bin/bash

This change worked on ubuntu which bash command on ubuntu to find the path of bash.

Siddharth
  • 331