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. Introduction

Quite a few times, we want to derive the path of the bash script, which we run on the command line. We usually need that path to help us to access files relative to the real location of the bash script in the filesystem.

In this tutorial, we shall learn the inner workings of achieving the same, whenever the bash script is a symbolic link.

The shell command readlink resolves the given file to its absolute path, after resolving the symbolic links. An example usage of readlink is:

$ls -ltar rlink 
lrwxrwxrwx 1 naresh naresh 14 Dec 13 11:28 rlink -> ../readlink.sh
$readlink -f rlink
/home/naresh/blogs/readlink.sh

As we can see above, we have a symbolic link to a file. Using the command readlink with -f  option, we can easily determine the absolute path of the file

Whenever we invoke a bash script, the $0 variable captures the script name. This variable identifies either the relative path of the script or the absolute path of the script. The path can also be a symbolic link to the actual script. The sample script:

#!/usr/bin/env bash
SCRIPTDIR=$(dirname "$(readlink -f "$0")")
echo "absolute path of the script $0 is $SCRIPTDIR"

As shown above, we are using three ideas from the bash script to determine the script directory

  • $0 is the bash variable that captures the script name
  • readlink command resolves the script name to its absolute path
  • dirname command extracts the directory from the absolute path

The variable SCRIPTDIR stores the directory of the bash script.

3. realpath

The shell command realpath is another handy command which can be used to find the absolute path of any file, given its relative path or a symbolic link to the file. An example of usage is:

$ls -ltar rpath
lrwxrwxrwx 1 naresh naresh 14 Dec 11 20:17 rpath -> ../realpath.sh
$realpath rpath
/home/naresh/blogs/realpath.sh

As illustrated above, using the command realpath, we can easily determine the absolute path of the file. We can also use realpath bash command along with the BASH_SOURCE environment variable to get the script location. The sample script:

#!/usr/bin/env bash
MYDIR=$(dirname "$(realpath  "$BASH_SOURCE")")
echo "absolute path of the script ${BASH_SOURCE} is $MYDIR"

As illustrated above, we are using two new ideas from the bash script to get the result

  • $BASH_SOURCE is the bash variable that captures the script name
  • realpath command resolves the script name to its absolute path

The variable MYDIR stores the directory of the bash script.

4. Conclusion

In this article, we saw two ways of determining the absolute path of a bash script, irrespective of how it is invoked.