在bash中获取硬链接的目标名称(即BASH_SOURCE)

时间:2013-12-09 15:17:27

标签: bash

#!/bin/bash
dir_self () {
    local source="${BASH_SOURCE[$1]}"
    while [ -h "$source" ]; do # resolve $source until the file is no longer a symlink
      dir="$( cd -P "$( dirname "$source" )" && pwd )"
      source="$(readlink "$source")"
      [[ $source != /* ]] && source="$dir/$source" # if $source was a relative symlink, we need to resolve it relative to the path where the symlink file was located
    done
    local dir="$( cd -P "$( dirname "$source" )" && pwd )"
    printf $dir
}
#source lib.bash,function,file, hard links return as link location, soft links as target
dir_self_file () {
    local num=2
    if [[ -n $1 ]];then
        num=3
    fi
    dir_self $num
}

我正在使用上述函数来确定一个文件的目录,该文件是一个包含所述函数的lib.bash(虽然不相关但不是执行文件的目录)。

考虑以下目录结构:

ln_s->dir/ln_targ
ln_h->dir/ln_targ
dir/ln_targ
lib.bash

可以通过以下方式使用:

. $LIB_DIR/lib.bash
echo $(dir_self_file)

ln_h中,它会回显ln_h的目录,而在ln_s中它将回显dir/ln_targ的目录。

理论上,我希望能够获得有关此示例提供的上下文的所有相关目录,即:

1) The directory of the sym link
2) The directory of the hard link
3) The directory of the target

正如您所看到的,dir_self提供的BASH_SOURCE输入指定了其中一个。

有没有办法用bash检索所有指定的值?

1 个答案:

答案 0 :(得分:1)

文件名到磁盘上的底层inode的映射是单向映射。给定任意inode,无法发现指向它的所有目录条目(即,存在该文件的硬链接)。这意味着,鉴于您的硬链接ln_h,您无法从文件本身找到另一个硬链接dir/ln_targ。文件的每个硬链接都与另一个文件相同;事实并非如此,其中一个是“真正的”名称,而其他人只是别名。

(但是,有可能知道存在多少文件的硬链接。文件系统跟踪此信息,以便它知道何时可以安全地回收文件使用的空间它不再具有任何硬链接。但是,当创建和删除新的硬链接时,此信息会更新。)