O problema é que o erro está acontecendo antes que o bash seja executado.
Quando você executa um script que começa com #!
, o kernel examina o restante da linha e o executa, com o nome do arquivo como o primeiro parâmetro. Portanto, quando você tiver um arquivo no formato DOS, o kernel verá /bin/bash^M
e tentará executá-lo como o programa. O que, claro, não existe.
Se você quisesse ser um pouco insano, você poderia criar um programa chamado /bin/bash^M
...
$ ls -lb /bin/bash?
-rwxr-xr-x 1 root root 61 Jun 18 22:41 /bin/bash\r
$ cat /bin/bash?
#!/bin/sh
echo Convert your program to Unix format!
exit 255
$ file foo
foo: Bourne-Again shell script, ASCII text executable, with CRLF line terminators
$ cat -v foo
#!/bin/bash^M
echo hello^M
$ ./foo
Convert your program to Unix format!
$ dos2unix foo
dos2unix: converting file foo to Unix format ...
$ ./foo
hello
Eu não tenho certeza se eu recomendaria isso!
Em vez disso, eu recomendaria a educação e um "livro de execução" de diagnóstico (por exemplo, os terminadores de linha CRLF do relatório de comando file
).