Answers:
readlink
如果可用,另一种选择是使用专门设计的命令。
例如
$ readlink -f `command -v php`
/usr/bin/php7.1
-f
是GNU的不可移植扩展readlink
。
在Mac OS X和FreeBSD / NetBSD / etc上。它的:
stat -f %Y <filename>
更一般地说,我猜解决方案是(stat --printf =%N使用奇怪的引号):
ls -l b | sed -e 's/.* -> //'
例:
# ln -s a b
# stat -f %Y b
a
另一种方法是:
# find b -maxdepth 0 -printf %l
a#
最后一行由于没有换行而被整顿,但是如果您需要将结果放入变量中,就可以了,就像这样
# f=$(find b -maxdepth 0 -printf %l)
# echo $f
a
如果碰巧是目录,-maxdepth
则需要使用来防止find
下降到b
目录中。
stat --printf='%N\n'
这正是我想要的,奇怪的引号不会打扰我,它们相同的引号rm和
link -> dest
在输出中打印出来。应该检查find(1)解决方案是否与GNU findutils一起使用...
echo $f
当符号链接指向时肯定不会产生期望的结果/*
(是可能的)
可移植:除了使用启发式解析ls -l输出,或者使用 perl -le 'print readlink("some-file")'
有些系统具有readlink
命令,有些系统具有-f
获取绝对路径的选项。
stat
作为stat
/ lstat
系统调用的包装器,命令有多种实现方式。GNU一个在这方面没有用,但是zsh的内置一个更是如此:
zmodload zsh/stat
stat +link the-link
仍然使用zsh,您可以使用:A
修饰符(适用于变量扩展,历史记录扩展和遍历)获得文件的绝对路径(删除每个symlink组件):
~$ gstat -c %N b
`b' -> `a'
~$ var=b
~$ echo $var:A
/home/me/a
~$ echo b(:A)
/home/me/a
~$ echo ?(@:A)
/home/me/a
在没有readlink
或没有stat
命令但有Python 2.x的系统上,我使用的是简短脚本:
#!/usr/bin/env python
import os, sys
if __name__ == "__main__":
src = sys.argv[1]
target = os.readlink(src)
if not os.path.isabs(target):
target = os.path.abspath(os.path.join(os.path.dirname(src), target))
print target
请注意,与readlink -f
此不同的是,它可能仅遵循一级符号链接。
便携式纯Bash Realpath
bash_realpath() {
# print the resolved path
# @params
# 1: the path to resolve
# @return
# &1: the resolved link path
local path="${1}"
while [[ -L ${path} && "$(ls -l "${path}")" =~ -\>\ (.*) ]]
do
path="${BASH_REMATCH[1]}"
done
echo "${path}"
}
realpath
coreutils
包装命令
如readlink
命令手册页中所链接。
例如:
realpath /bin/python
输出
/usr/bin/python2.7
在我的机器上。
readlink -f
如果您想知道最后一个符号链接目标,而不仅仅是下一个目标,请使用。