문제

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)

도움이 되었습니까?

해결책

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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top