【问题标题】:How can I derefence symbolic links in bash? [duplicate]如何取消引用 bash 中的符号链接? [复制]
【发布时间】:2010-11-14 22:10:27
【问题描述】:

如何获取bash 中的任何给定路径并将其转换为规范形式,取消引用路径中可能包含的任何符号链接?

例如:

~$ mkdir /tmp/symtest
~$ cd /tmp/symtest/
/tmp/symtest$ mkdir -p foo/bar cat/dog
/tmp/symtest$ cd foo/bar/
/tmp/symtest/foo/bar$ ln -s ../../cat cat
/tmp/symtest/foo/bat$ cd ../../
/tmp/symtest$ tree
.
|-- cat
|   `-- dog
`-- foo
    `-- bar
       `-- cat -> ../../cat

6 directories, 0 files

如何获得/tmp/symtest/foo/bar/cat 的完整规范路径(即:/tmp/symtest/cat)?

【问题讨论】:

  • 谢谢。我的 search-fu 没有找到那个问题。
  • 不用担心。我只知道寻找它,因为我问过它。 :)

标签: bash symlink


【解决方案1】:

感谢Andy Skelton,看来答案是readlink -f

$:/tmp/symtest$ readlink -f /tmp/symtest/foo/bar/cat
/tmp/symtest/cat

【讨论】:

  • 在 macOS bash 中,readlink 不存在 -f 选项,它用于相关 stat 命令的格式,与 readlink 共享一个手册页。 macOS bash 唯一有效的 readlink 选项似乎是:-n 不要强制在每段输出的末尾出现换行符。
【解决方案2】:

这是一个解析符号链接的函数
它的最初目的是解析调用脚本的完整路径 由 /usr/bin 符号链接指向

# resolve symbolic links
function resolve_link() {
  local LINK_FILE=${1:-${BASH_SOURCE[0]}}
  local FILE_TYPE=`file $LINK_FILE | awk '{print $2}'`
  local LINK_TO=$LINK_FILE
  while [ $FILE_TYPE = "symbolic" ]; do
    LINK_TO=`readlink $LINK_FILE`
    FILE_TYPE=`file $LINK_TO | awk '{print $2}'`
  done
  echo $LINK_TO
}

BASH_SOURCE_RESOLVED=$(resolve_link)
echo $BASH_SOURCE_RESOLVED

它不使用递归,但我从来没有在 bash 中使用递归

【讨论】:

  • 嗯,什么?这是不必要的复杂,无需复制标准readlink -f 功能。更不用说正确答案是在 3 年前发布的......
  • P.S.请参阅此 SO 答案:stackoverflow.com/questions/1055671/… 以获得更明智的解决方案,适用于没有 readlink -f 的系统,例如 Mac OS X。
猜你喜欢
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 2016-03-17
  • 2012-01-13
  • 2010-09-30
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
相关资源
最近更新 更多