205

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?

8 Answers 8

351

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
11
  • 32
    Or install and use the dos2unix program. Jun 6, 2013 at 22:56
  • 5
    thank you for this, all other answers Ive found so far have not helped. This one did it!
    – qodeninja
    Jun 9, 2014 at 23:39
  • 1
    @Michael macOS uses \n because it's Unix. The script was maybe from an earlier Mac OS version? You could run sed -i -e 's/\r$/\n/' script.sh in that case.
    – wjandrea
    Dec 21, 2016 at 4:49
  • 2
    Open it in gedit and, do Save As, and select "Line Ending: Unix/Linux"
    – Mattmon
    Nov 27, 2017 at 12:11
  • 1
    @ManuelJordan This is Ask Ubuntu, so I gave a command that works on Ubuntu, and more generally on Linux (including BusyBox). On other Unix-like systems you can use (for example) perl -i -pe 's/\r$//' … . On systems that don't recognize \r to mean a carriage return, the command I posted might error out of might remove r or \r (the two-character sequence backslash, lowercase R) at the end of lines. Recent macOS (at least Big Sur) does interpret \r as CR though. Dec 19, 2021 at 11:55
49

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

1
  • this one did it for me, thx
    – bunkerdive
    Aug 6, 2015 at 19:53
44

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.

1
  • 2
    Thanks, dos2unix is also available for macOS via brew. Sep 18, 2018 at 5:35
18

The Problem ist you edit with Dos!

open your file with vi then set unix with:

:set ff=unix
:wq

and it all fine

5

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]

2
  • See above answer about using :fileformat which is IMHO better for handling this than global substitution Also, see stackoverflow.com/questions/14609779/… for ideas on how to handle automatically
    – qneill
    Aug 11, 2017 at 15:58
  • I did :set list but say no special characters. Just a $ at the end of every line.
    – RonJohn
    Jan 16, 2022 at 5:30
5

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
4

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.

1
  • +1 for this because it helped me with MacOS line endings.
    – Bobble
    Apr 3, 2014 at 11:52
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.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .