2016-11-25 57 views
0

TL; DR:为什么[ symlink_to_file_a -ef file_a ]返回true?比较符号链接和他的目标与bash测试-ef


我需要测试,如果一个文件b(主要是符号连接)是不是文件一个同为试图知道如果一个b是硬连接在一起,和硬链接他们如果不是这样的话。
我使用条件表达式-efbash manual说:

文件1 -ef file2的
如果file1和file2指的是相同的设备和inode编号。

我只是比较符号链接/常规文件和一个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

注意,附近您链接到本手册的部分的顶部,它说:_Unless另有规定外,初选上的文件进行操作遵循符号链接并对链接的目标进行操作,而不是链接本身。也就是说,除了检查是否是符号链接(大致)时,它使用'stat()'系统调用而不是'lstat()'系统调用。 'ext4'信息只是关于符号链接指向的路径的磁盘存储;它不会影响功能(但是由于必须为非常长的符号链接读取额外的磁盘块,因此会影响性能)。 –

+0

我认为具体的指令将是详尽的:/感谢您的完整解释。 – F4240

回答