How to find script directory in an included shell script
bash, shell, tcsh, zsh
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`.
Problem
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)