包含脚本的真实路径

包含脚本的真实路径

包含的脚本可以知道它是否被包含并获取其真实路径吗?

假设有一个脚本调用sub.sh该脚本,在运行其主要逻辑之前检查用户是否有权访问脚本组:

#...
mypath=`realpath -e $0`
#if blablabla ... check mypath against user groups...
#
#...

上面的脚本可以包含在另一个脚本中,如下所示:

#...
. sub.sh
#...

但是,由于它包含在另一个脚本中,因此检查会针对调用者脚本运行,这不是所需的效果。

答案1

您可能正在寻找BASH_SOURCE数组(在 bash 中)。

例子:

源e.bs

fun(){
    echo "$0"
    echo "${BASH_SOURCE[0]}"
}

来源者.bs

#!/usr/bin/env bash
echo "$0"
echo "${BASH_SOURCE[0]}"
source sourcee.bs
fun

测试运行

$ ./sourcer.bs
./sourcer.bs
./sourcer.bs
./sourcer.bs
sourcee.bs    #Or the full path if it's in PATH instead of the PWD

答案2

$0在 ZShell 中:

% echo 'set | grep -a harglebargle' > harglebargle
% source harglebargle                             
0=harglebargle
%

(即使有人尝试过这一ARGV0=... source ...技巧,这似乎也是正确的。)

因此,对于完整路径:

% echo 'echo $0:a' > fullpath
% source fullpath
/home/jmates/tmp/fullpath
% 

相关内容