2013-12-08 179 views
4

我们现在使用dirname$0来查找shell脚本的目录,但是当脚本包含在另一个脚本中时,这不起作用。如何在包含的shell脚本中查找脚本目录

假设两个文件first.shsecond.sh

/tmp/first.sh:

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

/tmp/test/second.sh:

通过
#!/bin/sh 
echo $0 

运行first.sh第二脚本还打印first.shsecond.sh中的代码如何找到自己的目录? (寻找一种适用于bash/csh/zsh的解决方案)

+0

我不认为这是可能的。 – janos

+1

@janos:不,janos,有可能,看到我的回答 –

+0

@IgorChubin太棒了!我留下了这个评论,所以有人会回我;-) – janos

回答

3

没有任何解决方案可以在所有类型的shell中起到同样的作用。

bash你可以使用BASH_SOURCE

$(dirname "$BASH_SOURCE") 

例子:

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

正如你所看到的,脚本打印的2.sh名称, 虽然你开始/tmp/1.sh,包括2.shsource命令。

我必须注意,该解决方案仅适用于bash。在Bourne-shell(/bin/sh)中是不可能的。

在csh/tcsh/zsh中,您可以使用$_而不是BASH_SOURCE

+2

这是特定的bash。我提到的问题是,我正在寻找一种可以在bash/csh/zsh上运行的解决方案 –

+0

并且注意我使用了'/ bin/sh'作为解释器 –

+0

我在回答中已经注意到它只能在bash中工作。在bourne-shell中是不可能的。 –