Auf Linux und anderen unixartigen Systemen steht in der ersten Zeile eines Scripts ein Shebang (#!) gefolgt vom Pfad des Interpreters für dieses Script.
Bash-Scripte starten oft mit #!/bin/bash wärend Perl-Scripte mit #!/usr/bin/perl starten. Dem Betriebsystem hilft diese Zeile, direkt den richtigen Interpreter für dieses Script zu finden und so richtig mit der Datei umzugehen.
In vielen Anleitungen wird #!/bin/sh für Shellscripte empfohlen. Ich bin kein Fan davon, denn /bin/sh ist ein Symlink auf die bevorzugte Shell dieses Systems. Debian benutzt hier die dash, manche Admins bevorzugen aber auch die Korn Shell oder die Z-Shell. Hinter /bin/sh kann also je nach System eine andere Shell stehen.
Ich benutze /bin/bash und stelle damit sicher, dass mein unter der Bash geprüfte Script auch auf einer Bash ausgeführt wird. Aber ein BSD User hat mich neulich bekehrt, künftig „/usr/bin/env bash“ zu benutzen.
Der Grund dafür ist folgender: Nicht alle unixartigen Systeme legen die Bash in /bin ab. Manche Systeme haben diese unter /usr/bin. Gibt man nun /bin/bash im Script an, wird das starten des Scripts scheitern.
env ist ein Kommando, dass auf unixartigen Systemen immer in /usr/bin liegt und das Kommando im Parameter (hier: bash) innerhalb des Suchpfades des Systems (PATH-Variable) sucht und startet.
Mit env spielt es also keine Rolle mehr, ob die Shell in /bin, in /usr/bin oder sonstwo im Suchpfad liegt.
Nun, künftig starten meine Scripte also so:
#!/usr/bin/env bash