我们现在使用dirname
和$0
找到shell脚本的目录,但是当脚本包含在另一个脚本中时,这不起作用。
假设有两个文件first.sh
和second.sh
:
/tmp/first.sh:
#!/bin/sh
. "/tmp/test/second.sh"
/tmp/test/second.sh:
#!/bin/sh
echo $0
通过运行first.sh
,第二个脚本也会打印first.sh
。 second.sh
中的代码如何找到自己的目录? (搜索适用于bash / csh / zsh的解决方案)
答案 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
。