TL; DR:为什么[ symlink_to_file_a -ef file_a ]
返回true?比较符号链接和他的目标与bash测试-ef
我需要测试,如果一个文件b(主要是符号连接)是不是文件一个同为试图知道如果一个和b是硬连接在一起,和硬链接他们如果不是这样的话。
我使用条件表达式-ef
和bash 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是不同的,但测试成功,我没有看到什么是错的。
注意,附近您链接到本手册的部分的顶部,它说:_Unless另有规定外,初选上的文件进行操作遵循符号链接并对链接的目标进行操作,而不是链接本身。也就是说,除了检查是否是符号链接(大致)时,它使用'stat()'系统调用而不是'lstat()'系统调用。 'ext4'信息只是关于符号链接指向的路径的磁盘存储;它不会影响功能(但是由于必须为非常长的符号链接读取额外的磁盘块,因此会影响性能)。 –
我认为具体的指令将是详尽的:/感谢您的完整解释。 – F4240