Black Friday 2025 – NPI EA (cat = Baeldung on Linux)
announcement - icon

Yes, we're now running our Black Friday Sale. All Access and Pro are 33% off until 2nd December, 2025:

>> EXPLORE ACCESS NOW

Baeldung Pro – Linux – NPI EA (cat = Baeldung on Linux)
announcement - icon

Learn through the super-clean Baeldung Pro experience:

>> Membership and Baeldung Pro.

No ads, dark-mode and 6 months free of IntelliJ Idea Ultimate to start with.

Partner – Orkes – NPI EA (tag=Kubernetes)
announcement - icon

Modern software architecture is often broken. Slow delivery leads to missed opportunities, innovation is stalled due to architectural complexities, and engineering resources are exceedingly expensive.

Orkes is the leading workflow orchestration platform built to enable teams to transform the way they develop, connect, and deploy applications, microservices, AI agents, and more.

With Orkes Conductor managed through Orkes Cloud, developers can focus on building mission critical applications without worrying about infrastructure maintenance to meet goals and, simply put, taking new products live faster and reducing total cost of ownership.

Try a 14-Day Free Trial of Orkes Conductor today.

1. Overview

If a shell script isn’t executable, we cannot run it directly in the terminal. Of course, the execute permission of the script can be changed so that we can run it. But, that may not always be possible. For example, if the script belongs to another user, we may not have the necessary privileges to change the execute permission of the script using the chmod command.

In this tutorial, we’ll discuss running a script that isn’t executable.

2. Analyzing the Problem

If we have an executable script, we can run it directly in the terminal. Suppose we have the following script, hello_world.sh:

#!/bin/bash
echo “Hello World"

This script just prints Hello World and exits. We specify the interpreter of the script on the first line after the shebang (#!). In our case, the interpreter is /bin/bash. This tells the operating system to use Bash as the interpreter for parsing the remainder of the script.

Let’s first check the execute permission of this script:

$ ls –l hello_world.sh
-rwxr-xr-x 1 alice alice 31 May  6 08:32 hello_world.sh

Since the execute permission of the script is set for all users, we can run it directly in the terminal:

$ ./hello_world.sh
Hello World

Now, we’ll consider the case when the script isn’t executable. First, let’s remove the execute permission of the script hello_world.sh using chmod:

$ chmod -x hello_world.sh
$ ls –l hello_world.sh
-rw-r--r-- 1 alice alice 31 May  6 08:32 hello_world.sh

As it’s apparent from the output of the ls –l command, nobody – not even the owner of the script – has the right to execute this script. Let’s try to run it:

$ ./hello_world.sh
-bash: ./hello_world.sh: Permission denied

Our objective is to run the script hello_world.sh in the remainder of this tutorial.

3. Specifying the Shell Explicitly

One way to run a script that we don’t have the execute permission is to specify the shell explicitly while running the script. Let’s run the script, hello_world.sh, with the Bash interpreter:

$ /bin/bash ./hello_world.sh
Hello World

As we see, although the execute permission of the script isn’t set, we were able to run it. However, it’s a little less convenient to run it since we have to specify the interpreter on the command line. Here, we explicitly specified the interpreter /bin/bash, which executes the script.

If we’re able to specify the interpreter while running the script, we can run the script with another interpreter, for example, the Korn shell:

$ /bin/ksh ./hello_world.sh
Hello World

In this case, the interpreter we specify while running the script, /bin/ksh, overrides the one specified in the script after the shebang.

For this simple script, running the script with both Bash and Korn shells was successful, but that may not be always the case. The syntax of different shells may not be fully compatible with each other.

4. Sourcing the Script

Another way to run a script that isn’t executable is using the source command. Let’s run the script, hello_world.sh, using source

$ source ./hello_world.sh
Hello World

As we see, we ran a script that isn’t executable by sourcing it.

Sourcing a script means that we run the script in the current shell. So, if the script contains an exit command, we must be cautious since we may exit from the current shell itself.

We can use the dot or period character (.) instead of source and get the same result:

$ . ./hello_world.sh
Hello World

5. Conclusion

In this article, we discussed two different ways to execute a shell script that isn’t executable.

First, we showed that we can run a script that doesn’t have execute permission by specifying the shell explicitly while running it.

As an alternative to the first method, we saw that we could run a script that isn’t executable using the source command.