使用bash test -ef比较符号链接和他的目标

时间:2016-11-25 23:07:18

标签: bash symlink inode ext4

TL; DR:为什么[ symlink_to_file_a -ef file_a ]返回true?

我需要测试文件 b (主要是符号链接)是否与文件 a 相同,以便了解 a b 很难联系在一起,如果不是这样的话,就会把它们硬连接起来 我使用条件表达式-efbash manual说:

  

file1 -ef file2
    如果file1和file2引用相同的设备和inode编号,则为True。

我只比较符号链接/常规文件和 a b 的inode不同,但结果为True

类似question的答案说:

  
    

如果是,那么目标和链接的inode编号是否相同?

  
     

没有。通常,符号链接是一个具有自己的inode的文件(具有文件类型,自己的数据块等)。

我不确定我的理解但我可能会在ext4 spec找到一些解释:

  

如果目标字符串长度小于60个字节,则符号链接的目标将存储在此字段中。否则,将使用范围或块映射来分配数据块以存储链接目标。

我试过目标更短/超过60B,但没有区别。

$ cat test.sh
#!/usr/bin/env bash
foo="foooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo"
mkdir /tmp/test
cd /tmp/test
touch a
ln -s /tmp/test/a b
ls -li
if [ a -ef b ]
then
  echo b : same device or inode of a
 else
  echo b : different device or inode of a
fi
mkdir /tmp/test/${foo}
cd /tmp/test/${foo}
touch c
ln -s /tmp/test/${foo}/c d
ls -li
if [ c -ef d ]
then
  echo d : same device or inode of c
else
  echo d : different device or inode of c
fi
$ ./test.sh
156490 -rw-rw-r-- 1 msi msi  0 nov.  25 23:55 a                                                                                                                                                                                                
156491 lrwxrwxrwx 1 msi msi 11 nov.  25 23:55 b -> /tmp/test/a                                                                                                                                                                                 
b : same device or inode of a                                                                                                                                                                                                                  
total 4                                                                                                                                                                                                                                        
156494 -rw-rw-r-- 1 msi msi   0 nov.  25 23:55 c
156495 lrwxrwxrwx 1 msi msi 155 nov.  25 23:55 d -> /tmp/test/foooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo/c
d : same device or inode of c

Inodes不同但测试成功,我没有看到什么是错误的。

1 个答案:

答案 0 :(得分:1)

似乎文档在某些地方会产生误导。来自http://www.tldp.org/LDP/abs/html/fto.html

  

f1 -ef f2

     

文件 f1 f2 是指向同一文件的硬链接

正如您已经发现的那样,该表达式不仅对于硬链接而且对于同一文件的 soft 链接都返回true。

改为使用stat

if [ "$(stat -c "%d:%i" FILE1)" == "$(stat -c "%d:%i" FILE2)" ]

来源: https://superuser.com/questions/196572/check-if-two-paths-are-pointing-to-the-same-file