如何在包含的shell脚本中查找脚本目录

时间:2013-12-08 09:06:39

标签: bash shell zsh tcsh

我们现在使用dirname$0找到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的解决方案)

1 个答案:

答案 0 :(得分:3)

没有任何解决方案可以在所有类型的贝壳中同样有效。

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.sh包含source命令。

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

在csh / tcsh / zsh中,您可以使用$_代替BASH_SOURCE