Question

We now to find the directory of a shell script using dirname and $0, but this doesn't work when the script is inluded in another script.

Suppose two files first.sh and second.sh:

/tmp/first.sh :

#!/bin/sh
. "/tmp/test/second.sh"

/tmp/test/second.sh :

#!/bin/sh
echo $0

by running first.sh the second script also prints first.sh. How the code in second.sh can find the directory of itself? (Searching for a solution that works on bash/csh/zsh)

Was it helpful?

Solution

There are no solution that will work equally good in all flavours of shells.

In bash you can use BASH_SOURCE:

$(dirname "$BASH_SOURCE")

Example:

$ cat /tmp/1.sh
. /tmp/sub/2.sh
$ cat /tmp/sub/2.sh
echo $BASH_SOURCE
$ bash /tmp/1.sh 
/tmp/sub/2.sh

As you can see, the script prints the name of 2.sh, although you start /tmp/1.sh, that includes 2.sh with the source command.

I must note, that this solution will work only in bash. In Bourne-shell (/bin/sh) it is impossible.

In csh/tcsh/zsh you can use $_ instead of BASH_SOURCE.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top