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

4
我们现在使用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.sh。那么在second.sh中的代码如何找到自己所在的目录?(寻找适用于bash/csh/zsh的解决方案)

我认为这是不可能的。 - janos
1
@janos:不,janos,这是可能的,看看我的答案。 - Igor Chubin
@IgorChubin 太棒了!我留下那个评论是想有人回复我;-) - janos
1个回答

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,它也包含了使用source命令的2.sh

需要注意的是,这个解决方案只适用于bash。在Bourne-shell (/bin/sh)中是不可能实现的。

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


2
这是特定于Bash的。我在问题中提到,我正在寻找适用于Bash / Csh / Zsh的解决方案。 - Taha Jahangir
1
@TahaJahangir:你写道你在寻找tcsh/zsh/bash的解决方案;我已经为你提供了。我的解决方案适用于bash/tcsh/zsh。 - Igor Chubin
在bash中,我们可以使用${VAR:-DEFAULT}结构来使用另一个变量(如果$VAR未定义),但这在tsch/zsh中不起作用。而且,在sh中,$_也不起作用!你能修改你的解决方案,使其在csh、bash或sh上运行吗? - Taha Jahangir
@TahaJahangir:我知道,在Bourne shell中$_是无法使用的。我已经写过了。据我所知,在Bourne shell中没有找到包含脚本名称的方法。 - Igor Chubin
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/42730/discussion-between-taha-jahangir-and-igor-chubin - Taha Jahangir
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接