Is it possible to make a shell script execute using bash instead of sh?



Despite my efforts to search online, I haven’t come across a direct answer to my query. Nevertheless, I believe the solution is uncomplicated.

As I’m creating shell scripts for diverse objectives that will be executed by various individuals, it’s possible that some of them might use “sh” instead of “bash” to call the script.

Is there a method to make a script that requires bash to function properly, execute under bash instead of “sh” even if it was initially invoked with “sh”?

Solution 1:

According to Richard Pennington, the correct approach is to possess.


as the first line of the script.

However, explicitly invoking it through the


command will render it ineffective. To illustrate, consider the scenario where I type.

sh your-script-name

The line identified by


will be disregarded.

It’s not entirely possible to stop individuals from doing that, however, you can deter them by including a statement like the following at the beginning of the script:

if [ ! "$BASH_VERSION" ] ; then
    echo "Please do not use sh to run this script ($0), just execute it directly" 1>&2
    exit 1

Or you could do something like:

if [ ! "$BASH_VERSION" ] ; then
    exec /bin/bash "$0" "$@"

Although it may seem simple to invoke


script using its normal name, there is a possibility of it going wrong very easily. This is because there is no guarantee that the script name you know is the one that can be used to invoke it. In case of any misconfiguration in your system or if you get it wrong, it could lead to an infinite loop.

My suggestion would be to go with the approach of displaying error messages.

Please note that I have recently made an update to this response, which includes the script’s name in the error message. This information could be useful for users.

Solution 2:

#! /bin/bash
# The rest of your script.

Frequently Asked Questions