TL; DR:なぜ[ symlink_to_file_a -ef file_a ]
がtrueを返しますか?私は、ファイルBは(主にシンボリックリンク)とBはハード一緒にリンクされているかどうかを知るしようとしている、とハードリンクのファイルと同じであるかどうかをテストする必要がシンボリックリンクとターゲットをbashテストと比較する-ef
もしそうでなければそれら
私は条件式-ef
とbash manualを使用するには、こう述べています。
ファイルfile1 -ef file2の
真file1とFILE2が同じデバイスとiノード番号を参照している場合。
私はとBが異なっているが、結果はTrue
あるの単なるシンボリックリンク/通常のファイルとiノードを比較します。
同様のquestionの答えはこう述べています。
yesの場合は、iノード番号はターゲットとリンクについては同じでしょうか?
号通常、シンボリックリンクは私が理解したが、何のわからない
(ファイルタイプ、独自のデータ・ブロックなどで)独自のiノードを持つファイルであり、I 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
iノードは異なるですが、テストは成功し、私は何が間違っているのか分かりませんでした。
メモにリンクマニュアルのセクションの上部付近に、それは言うこと:ファイルを操作_Unless特に指定し、プライマリは続きますリンク自体ではなく、リンクのターゲット上で動作します。つまり、何かがシンボリックリンク(大体)であるかどうかを確認するときを除いて、 'stat()'システムコールを使用し、 'lstat()'システムコールは使用しません。 'ext4'情報は、シンボリックリンクが指し示すパスのディスクストレージに関するものです。機能には影響しません(ただし、非常に長いシンボリックリンクの場合は余分なディスクブロックを読み込む必要があるため、パフォーマンスに多少の影響があります)。 –
私は具体的な指示が網羅的であると思った:/この完全な説明をありがとう。 – F4240