TL;DR: почему [ symlink_to_file_a -ef file_a ]
возвращает true?
Мне нужно проверить, является ли файл b (в основном символическая ссылка) тем же, что и файл a, чтобы попытаться узнать, являются ли a и b жестко связаны друг с другом и жестко свяжут их, если это не так.
Я использую условное выражение -ef
и руководство по bash говорит:
файл1 -ef файл2
Истинно, если файл1 и файл2 относятся к одному и тому же устройству и номерам инодов.
Я сравниваю только символическую ссылку/обычный файл, и индексные дескрипторы a и b разные, но результат True
.
Ответ на аналогичный вопрос гласит:
Если да, то будет ли номер инода одинаковым для цели и ссылок?
Нет. Обычно символическая ссылка представляет собой файл со своим индексным узлом (с типом файла, собственными блоками данных и т. д.)
Я не уверен в том, что я понял, но я мог найти некоторые пояснения по этому поводу в спецификация ext4 :
Цель символической ссылки будет храниться в этом поле, если целевая строка имеет длину менее 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
Иноды разные, но тест прошел успешно, и я не увидел, что не так.
stat()
, а не системный вызовlstat()
. Информацияext4
просто о дисковом хранилище для пути, на который указывает символическая ссылка; это не влияет на функциональность (но незначительно влияет на производительность, поскольку для очень длинных символических ссылок необходимо читать дополнительный блок диска). - person Jonathan Leffler   schedule 27.11.2016