2016-11-25 11 views
0

TL; DR:なぜ[ symlink_to_file_a -ef file_a ]がtrueを返しますか?私は、ファイルBは(主にシンボリックリンク)Bはハード一緒にリンクされているかどうかを知るしようとしている、とハードリンクのファイルと同じであるかどうかをテストする必要がシンボリックリンクとターゲットをbashテストと比較する-ef


もしそうでなければそれら
私は条件式-efbash 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ノードは異なるですが、テストは成功し、私は何が間違っているのか分かりませんでした。

+1

メモにリンクマニュアルのセクションの上部付近に、それは言うこと:ファイルを操作_Unless特に指定し、プライマリは続きますリンク自体ではなく、リンクのターゲット上で動作します。つまり、何かがシンボリックリンク(大体)であるかどうかを確認するときを除いて、 'stat()'システムコールを使用し、 'lstat()'システムコールは使用しません。 'ext4'情報は、シンボリックリンクが指し示すパスのディスクストレージに関するものです。機能には影響しません(ただし、非常に長いシンボリックリンクの場合は余分なディスクブロックを読み込む必要があるため、パフォーマンスに多少の影響があります)。 –

+0

私は具体的な指示が網羅的であると思った:/この完全な説明をありがとう。 – F4240

答えて

1

一部の場所では、ドキュメントのように誤解を招くようです。 http://www.tldp.org/LDP/abs/html/fto.htmlから:

F1 -ef F2

ファイルF1F2は、同じファイルへのハードリンクは、すでに自分自身を発見したよう

は、その式がtrueを返していませんハードリンクの場合のみ、またの場合はソフトが同じファイルにリンクします。

使用stat代わり:

if [ "$(stat -c "%d:%i" FILE1)" == "$(stat -c "%d:%i" FILE2)" ] 

出典: https://superuser.com/questions/196572/check-if-two-paths-are-pointing-to-the-same-file

関連する問題