Scripts: shebang

A script without a #! (the so called shebang) in the very first line of the script is run by the “Bourne Shell”. To change the interpreter of the script you use the #!. Most often in scripts you will see that, it’s still #! /bin/sh though.


echo "I am in the Bourne shell (maybe)"

That a Bourne compatible shell is reachable via /bin/sh is by convention, meaning that a system, where this is not the case, could be considered broken.

The Bourne Shell sh would be my ideal scripting environment, as it’s ubiquitous and can do everything that I need. There is just one snag. It’s very weak on string processing. In fact for most string manipulation tasks you need to rely on external tools like sed or tr. This makes the Bourne Shell just too slow. So in comes…


The bash has good string manipulation routines. It’s not the speediest kid on the block, but it gets the job done. And it’s everywhere.

/usr/bin/env bash

Unfortunately unlike sh, bash is not placed into /bin on every platform. So to get to the location of bash on the current system, without having to change the scripts for every install, one can use the useful env command, that searches the environment variable PATH for a command and then executes it.

#!/usr/bin/env bash

echo "Now I am in bash!"


How dependable is the absolute path /usr/bin/env though ? Is it guaranteed by POSIX ? I don’t know. But so far this never failed me. #! /bin/bash though has and also #! /usr/bin/bash. So this is a step forward.