Make a bash script detect the directory it's stored in, to access data there

You may need to write a bash shell script that accesses data stored alongside the script, while your current working directory might be elsewhere. In my case the shell script needed to use Node.js scripts stored next to the shell scripts -- the shell script acting to simplify running the Node.js scripts. The "data" to be accessed in this case is the Node.js scripts, plus the support modules required to run them. You may have other data like a list of hostnames or who-knows-what.

The basic outline is

  • A directory storing one or more shell scripts
  • Data or other scripts in that directory
  • The need to perform work using those scripts but acting on other data elsewhere in the system

It comes down to a simple question - Can a Bash script tell which directory it is stored in? Or, how to get the path of the directory in which a Bash script is located FROM that Bash script?

The answer is easy - one must understand two of the normal commands installed on Unix-like systems: basename and dirname

The other thing to understand is that the $0 parameter contains the full pathname of the script being run.

$ sh opuc16/a.sh
opuc16/a.sh
$ sh ~/work/opuc16/a.sh
/Users/david/work/opuc16/a.sh
$ cat /Users/david/work/opuc16/a.sh
echo $0

Now, if we change the script a little bit:

$ cat /Users/david/work/opuc16/a.sh
echo script path = $0
echo basename = `basename $0`
echo dirname = `dirname $0`

Then run it again

$ sh ~/work/opuc16/a.sh
script path = /Users/david/work/opuc16/a.sh
basename = a.sh
dirname = /Users/david/work/opuc16

Now you can see a path forward, yes? The $0 variable has the full pathname, and it's easy to determine the directory the script is stored in.

Your shell script might start with this:

scriptdir=`dirname $0`

Then for anything the shell script wants to access in its home directory

node ${scriptdir}/script1
node ${scriptdir}/script2
node ${scriptdir}/script3

Likewise any data can be accessed the same way.

For a Node.js script, the search for modules begins in the directory containing the script being executed. Therefore the directory should contain a package.json file listing the dependencies, and you must run npm install in that directory to install those dependencies. With that small bit of setup, the script can be run from anywhere on the computer and the Node.js scripts will execute correctly.