ファイルのtruenameとは、すべての階層でシンボリックリンクを辿り、リンクがなくなるまで進んだ後、名前の構成要素として現れる‘.’や‘..’を簡略化して取り除いた名前のことである。これにより、ファイルの一種の正準名が得られる。ファイルが常に一意のtruenameを持つとは限らず、ファイルが持つ異なるtruenameの数は、そのファイルへのハードリンクの数に等しい。しかし、truenameは名前の変動要因となるシンボリックリンクを排除できるため、有用である。
この関数は、ファイル filename
の真名を返します。引数が絶対ファイル名でない場合、この関数はまずそれを default-directory に照らして展開します。
この関数は環境変数を展開しません。展開を行うのは substitute-in-file-name
のみです。ファイル名内の置換の定義を参照してください。
名前構成要素として現れる ‘..’
より前のシンボリックリンクを辿る必要がある場合は、expand-file-name
への直接的または間接的な呼び出しを事前に行わずに file-truename
を呼び出してください。そうでない場合は、file-truename
が呼び出される前に、‘..’
の直前にあるファイル名構成要素が簡略化されます。expand-file-name
への呼び出しを不要にするため、file-truename は ‘~’ を expand-file-name
と同様の方法で処理します。
シンボリックリンクのリンク先にリモートファイル名の構文が含まれている場合、file-truename
はそれをクォート付きで返します。ファイル名を展開する関数を参照してください。
この関数は、filename を起点として、シンボリックリンクではないファイル名が見つかるまでシンボリックリンクを辿ります。その後、そのファイル名を返します。この関数は、親ディレクトリレベルのシンボリックリンクは辿りません。
limit に数値を指定すると、その数だけリンクを辿った後、たとえそれが依然としてシンボリックリンクであっても、関数は単に現在の値を返します。
file-chase-links と file-truename の違いを説明するため、/usr/foo がディレクトリ /home/foo
へのシンボリックリンクであり、/home/foo/hello
が通常のファイル(あるいは少なくともシンボリックリンクではない)であるか、または存在しないと仮定します。すると、次のようになります。
(file-chase-links "/usr/foo/hello")
;; This does not follow the links in the parent directories.
⇒ "/usr/foo/hello"
(file-truename "/usr/foo/hello")
;; Assuming that /home is not a symbolic link.
⇒ "/home/foo/hello"
この関数は、ファイル file1 と file2
が同一のファイルを指している場合に t を返します。これは truenames
を比較するのと同様ですが、リモートファイル名も適切に処理される点が異なります。file1 または file2 が存在しない場合、戻り値は未規定となります。
ファイル名やその一部を文字列として比較する必要がある場合があり、その際は基盤となるファイルシステムが大文字小文字を区別しないかどうかを知ることが重要です。この関数は、ファイル
filename が大文字小文字を区別しないファイルシステム上にある場合に t を返します。MS-DOS および MS-Windows では常に t を返します。Cygwin および macOS
では、ファイルシステムが大文字小文字を区別する場合としない場合があり、この関数は実行時のテストによって大文字小文字の区別を判定しようとします。テストで判定がつかない場合、この関数は
Cygwin では t を、macOS では nil を返します。
現在、この関数は MS-DOS、MS-Windows、Cygwin、および macOS 以外のプラットフォームでは常に nil を返します。Samba 共有や NFS マウントされた Windows
ボリュームなど、マウントされたファイルシステムの大文字小文字の区別は判定しません。リモートホストでは、‘smb’ メソッドに対して t
とみなします。それ以外のすべての接続メソッドについては、ランタイムテストが実行されます。
この関数は、指定された file に対応する VC バックエンドを特定します。例えば、emacs.c が Git で追跡されているファイルの場合、(vc-responsible-backend "emacs.c") は
‘Git’ を返します。なお、file がシンボリックリンクである場合、vc-responsible-backend
はそれを解決せず、シンボリックリンクファイル自体のバックエンドが報告されます。file
が参照するファイルのバックエンド VC を取得するには、file を file-chase-links のようなシンボリックリンク解決関数でラップしてください:
(vc-responsible-backend (file-chase-links "emacs.c"))