Kal*_*ser 40 linux shell symbolic-link
鉴于这个例子:
mkdir a
ln -s a b
ln -s b c
ln -s c d
Run Code Online (Sandbox Code Playgroud)
如果我执行:
ls -l d
Run Code Online (Sandbox Code Playgroud)
它会显示:
d -> c
Run Code Online (Sandbox Code Playgroud)
有没有办法ls
或任何其他linux命令来d -> c -> b -> a
代替显示?
小智 77
只需使用namei
:
$ namei d
f: d
l d -> c
l c -> b
l b -> a
d a
Run Code Online (Sandbox Code Playgroud)
Pau*_*aul 20
readlink -e <link>
阅读链接 [选项]... 文件
- -e, --canonicalize-existing
通过递归遵循给定名称的每个组件中的每个符号链接来规范化,所有组件都必须存在
$ mkdir testlink
$ cd testlink
pjb@pjb-desktop:~/testlink$ ln -s c b
pjb@pjb-desktop:~/testlink$ ln -s b a
pjb@pjb-desktop:~/testlink$ ls -l
total 0
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 a -> b
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 b -> c
pjb@pjb-desktop:~/testlink$ echo foo > c
pjb@pjb-desktop:~/testlink$ cat a
foo
pjb@pjb-desktop:~/testlink$ readlink -e a
/home/pjb/testlink/c
Run Code Online (Sandbox Code Playgroud)
注意: readlink a 本身返回 b
注意#2:与 find -l 一起,可以很容易地用 perl 编写列出链的实用程序,但还必须足够智能以检测循环
如果您有循环, readlink 将不会输出任何内容。我想这比被卡住要好。
pjb@pjb-desktop:~/testlink$ ln -sf a c
pjb@pjb-desktop:~/testlink$ ls -l
total 0
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 a -> b
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 b -> c
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 09:03 c -> a
pjb@pjb-desktop:~/testlink$ readlink -e a
pjb@pjb-desktop:~/testlink$ # (note: no output)
Run Code Online (Sandbox Code Playgroud)