TL; DR: почему [ symlink_to_file_a -ef file_a ]
return true?Сравните символическую ссылку и его цель с помощью теста bash -ef
мне нужно проверить, если файл б (в основном символический) то же самое, чем файл за попытку узнать, если и б трудно связаны друг с другом, и жесткая связь если это не так.
Я использую условное выражение -ef
и bash manual говорит:
file1 -ef file2
Правда, если file1 и file2 относятся к одному устройству и номера индексных дескрипторов.
Я сравниваю только символьной ссылки/обычный файл и дескрипторы из и б различны, но результат True
.
Ответ подобного question говорит:
Если да, то будет ли номер индекса будет одинаковым для цели и ссылок?
No. Обычно символическая файл со своим собственным иноду (с файлом типа, собственные блоки данных и т.д.)
Я не уверен, что я понял, но я может нашел некоторые объяснения по этому поводу в ext4 spec:
цель символической ссылки будут сохранены в этой области, если целевая строка длиной менее 60 байт. В противном случае для распределения блоков данных для хранения целевого объекта ссылки будут использоваться либо экстенты, либо карты блоков.
Я попытался использовать цель короче/длиннее 60В, но нет никакой разницы.
$ 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
Иноды разные, но тест преуспевает, и я не видел, что не так.
Обратите внимание, что в верхней части раздела руководства Вы связываетесь, он говорит: _Unless не указано иное, праймериз, которые работают с файлами следовать символические ссылки и работать с объектом ссылки, а не с самой ссылкой. То есть, за исключением случаев, когда проверка является символьной ссылкой (примерно), она использует системный вызов 'stat()', а не системный вызов 'lstat()'. Информация 'ext4' - это просто о дисковой памяти для пути, на который указывает символическая ссылка; это не влияет на функциональность (но незначительно влияет на производительность, поскольку дополнительный блок диска должен быть прочитан для очень длинных символических ссылок). –
Я думал, что конкретная инструкция будет исчерпывающей:/Спасибо за это полное объяснение. – F4240