$ ./test.sh
./test.sh: line 1: #!/bin/bash: No such file or directory
$ cat test.sh
#!/bin/bash
$ ll /bin/bash
-rwxr-xr-x 1 root root 1.1M May 15 2017 /bin/bash
WTF?! Wo ist der Fehler? Ein Blick mit dem hexeditor zeigt seltsame Zeichen am Dateianfang, die im Texteditor nicht sichtbar sind.
$ head -n 1 test.sh | hexdump -C
00000000 ef bb bf 23 21 2f 62 69 6e 2f 62 61 73 68 0a |...#!/bin/bash.|
Die Hex Zeichenfolge ef bb bf ist ein BOM (Byte order mark) und steht in diesem Fall für die Codierung einer UTF8 Datei. Diese wurde wohl automatisch in die Datei eingefügt. Nur ist Unix älter als Unicode und damals hat sich wirklich keiner dafür interessiert, so dass BOM beim interpretieren der Shellskripte nicht mit interpretiert wird. Braucht man dort auch wirklich nicht.
Leider haben die Unicode Leute nichts seit 1960 gelernt und packen wieder Kontrollzeichen in Plaintext Dateien rein. Mit dem Ergebnis, dass alles inkompatibel bleibt. Plaintext - Klartext, nimm es wörtlich. Für alle die es vergessen haben: Mit plain text (engl. für einfacher, schlichter Text) werden Daten bezeichnet, die direkt unter Verwendung einer Zeichenkodierung in Text umgesetzt werden können. Dies ist mit BOM nicht der Fall. Fail.
Mit vim bekommt man die BOM Bombe leicht wieder weg:
:set nobomb
:wq
$ head -n 1 test.sh | hexdump -C
00000000 23 21 2f 62 69 6e 2f 62 61 73 68 0a |#!/bin/bash.|
$ ./test.sh
$