6

I created this script to backup my postgresql database with cron:

backup.sh

#!/bin/bash
export PGUSER="user"
export PGPASSWORD="pass"
FECHA_ACTUAL=`date +%Y-%m-%d`
HORA_ACTUAL=`date +%H:%M`
ARCH_RESP=$FECHA_ACTUAL-$HORA_ACTUAL
pg_dump -O -Fc mydb -h localhost > /home/user/backups/backup_$ARCH_RESP.sql
find /home/user/backups/ -name '*.sql' -mtime +2 -exec rm -f {} \;
unset PGUSER
unset PGPASSWORD

If I copy and paste this code on the terminal it works fine, but if I try to run the script, I get this error:

user@dental:~/scripts$ ./backup.sh
export: bad interpreter: no such file or directory

Is there something wrong with my script? Or is it the wrong interpreter as it says?

  • 1
    Whats the output of type -a bash? – heemayl Aug 22 '16 at 12:18
  • Please edit the question and post the output of this command: head -n 1 backup.sh | od -c. – terdon Aug 22 '16 at 12:21
  • 1
    Your file is probably not in Linux format. if the output of [ file <your-file> ] tells "ASCII text, with CRLF line terminators", then change format using dos2unix. – tonioc Aug 22 '16 at 12:30
11

I can get the same error if the first line is terminated only with a CR (instead of LF):

$ echo -en '#!/bin/bash\rexport foo=bar\n' > test.sh
$ chmod +x test.sh
$ ./test.sh
export: bad interpreter: No such file or directory

What happens is that the kernel looks for an interpreter program called /bin/bash\rexport, doesn't find it, and drops an error. Bash prints an error message with the name of the file

bash: ./test.sh: /bin/bash\rexport: bad interpreter: No such file or directory

but since the carriage return moves the output back to the front of the line, you see only

export: bad interpreter: No such file or directory

So the problem seems to be with the line endings.

Note that with a DOS-style CRLF line ending, the result is different, since there is an LF to end the line now.

$ echo -en '#!/bin/bash\r\nexport foo=bar\n' > test.sh
$ ./test.sh    
bash: ./test.sh: /bin/bash^M: bad interpreter: No such file or directory

Though I don't know why bash seems to quote the CR on output as ^M this time.


IIRC the lone CR as a line ending is a remnant of old Mac systems, and dos2unix doesn't seem to fix it by default. You'd need to use mac2unix or dos2unix -c mac.

Something like this should also turn all of CR or CRLF to Unix-style LF line endings, if you happen to have all styles mixed up and have no need for the CR's in any other sense.

sed 's/\r/\n/g;s/\n$//' backup.sh
  • Thanks it worked with the sed 's/\r/\n/g;s/\n$//' backup.sh – Elros Romeo Aug 22 '16 at 20:20
  • What did I do wrong with when I created my sh? – Elros Romeo Aug 22 '16 at 20:21
  • @ElrosRomeo That's harder to say, since we don't how you created it. Some editors can choose the line ending style, so it might just be a misconfiguration on the editor. – ilkkachu Aug 22 '16 at 21:05
  • Thanks, I wrote it with mousepad and saved it with sh extension, then I chmod the file with 777 – Elros Romeo Aug 22 '16 at 21:34

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.