総合手引 | セクション 7 | English | オプション |
シンボリックリンクとこれが参照するオブジェクトは ファイルシステムの名前空間において共存しますので、 リンク自身と参照されるオブジェクトの区別に関して混乱が生じることがあります。 歴史的には、コマンドおよびシステムコールは、 場当たり的にそれぞれ独自のリンク追跡規則を採用してきました。 このシステムに実装されている、統一的なアプローチの規則をここに示します。 ユーザインタフェースをできる限り一貫性あるものとするために、 ローカルアプリケーションもまたこの規則を守ることが重要です。
シンボリックリンクの操作は、リンク自身への操作、 もしくはリンクによって参照されるオブジェクトへの操作によって実現されます。 後者の場合、アプリケーションまたはシステムコールがリンクを "追跡 (follow)" したと言います。 シンボリックリンクは他のシンボリックリンクを参照することができます。 この場合、シンボリックリンクではないオブジェクトが見付かるか、 存在しないファイルを参照するシンボリックリンクが見付かるか、 ループが検出されるまで、 リンクが手繰られます。 (ループ検出は、追跡可能なリンク数の上限を設定することにより実現されます。 この制限を超過する場合にはエラーとなります。)
議論すべき領域で異なるものが 3 つあります。それらは次の通りです:
次の例外を除き、全システムコールはシンボリックリンクを追跡します。 例えば、 "afile" という名前のファイルを指すシンボリックリンク "slink" が存在する場合、システムコール "open("slink" ...amp;)" はファイル "afile" のファイル記述子を返します。
リンクを追跡せずに、シンボリックリンク自身を操作するシステムコールが 9 つあります。 それらは次の通りです: lchflags(2), lchmod(2), lchown(2), lstat(2), lutimes(2), readlink(2), rename(2), rmdir(2), unlink(2) 。 remove(3) は unlink(2) の別名ですから、これもまたシンボリックリンクを追跡しません。 rmdir(2) は、シンボリックリンクに対して適用されると、エラー ENOTDIR で失敗します。
既存のシンボリックリンクの所有者およびグループの変更は、 lchown(2) システムコールにて可能です。 既存のシンボリックリンクの フラグ・アクセスパーミッション・所有者/グループ・修正時刻は、それぞれ lchflags(2), lchmod(2), lchown(2), lutimes(2) システムコールで変更可能です。 これらのうち、システムが使用するのはフラグのみであり、 アクセスパーミッションと所有者情報は無視されます。
BSD 4.4 システムは歴史的な BSD 4 システムとは異なり、システムコール chown(2) がシンボリックリンクを追跡するように変更されました。 後になって、新しい chown(2) の制限が明らかになると、 lchown(2) システムコールが追加されました。
下に述べる例外を除き、コマンドは、 コマンドライン引数として指定されるシンボリックリンクを追跡します。 例えば、 "afile" という名前のファイルを指すシンボリックリンク "slink" が存在する場合、コマンド "cat slink" はファイル "afile" の内容を表示します。
この規則は、ファイルツリーをたどることもできるコマンドも含みます。 これを認識することが重要です。 例えば、コマンド "chown file" はこの規則に含まれますが、コマンド "chown -R file" は含まれません。 (後者は第 3 の領域で後述します。)
コマンドがシンボリックリンクを追跡するのではなく
シンボリックリンク自身を操作する
ことが明示的に意図されている場合、
例えば
"chown slink"
が、シンボリックリンクであるか否かにかかわらず、
"slink"
自身の所有者を変更したい場合、
この規則には 4 つの例外があります。 mv(1) および rm(1) のコマンドは、引数として指定されるシンボリックリンクを追跡せずに、 それぞれシンボリックリンク自身を改名したり削除しようとします。 (シンボリックリンクがファイルを相対パスで指定する場合、 シンボリックリンクを他のディレクトリに移動してしまうと、 パスが正しくなくなってしまいますので、 追跡できなくなります。)
ls(1)
コマンドもまたこの規則の例外です。
歴史的なシステムとの互換性のために (
ls
がツリーをたどらない場合、すなわち
file(1)
コマンドもまたこの規則の例外です。
file(1)
コマンドは、引数として指定されるシンボリックリンクを、
デフォルトでは追跡しません。
BSD 4.4 システムは歴史的な BSD 4 システムとは異なり、 chown, chgrp のコマンドがコマンドラインに指定されたシンボリックリンクを追跡します。
ファイルシステムをたどるときに出会うシンボリックリンクおよび コマンドライン引数として指定されるシンボリックリンクに対し、 次の規則が等しく適用されることを認識することが重要です。
最初の規則は、 ディレクトリ型ではない ファイルを参照するシンボリックリンクに対して適用されます。 シンボリックリンクに対して適用される操作は、 リンク自身に対してなされますが、 そうでない場合にはリンクは無視されます。
コマンド "rm -r slink directory" は "slink" を削除し、 "directory" のツリーをたどるときに出会うシンボリックリンクもまた削除します。 なぜなら、シンボリックリンクは削除可能であるためです。 いかなる場合も、 "slink" が参照するファイルに rm が影響することはありません。
第 2 の規則は、 タイプがディレクトリであるファイルを参照するシンボリックリンクに適用されます。 デフォルトでは、 タイプがディレクトリであるファイルを参照するシンボリックリンクは "追跡" されません。 これはしばしば "物理" 探索と呼ばれ、 "論理" 探索 (ディレクトリを参照するシンボリックリンクが追跡される場合です) の対極に位置します。
可能な限り一貫性を持たせるため、
シンボリックリンクが参照するファイルのタイプに依存せずに、
ファイルツリーをたどるコマンドに
コマンドラインで指定されるシンボリックリンクを追跡させるためには、
例えば、コマンド
"chown -HR user slink"
は、
"slink"
で指されるファイルを根とするファイル階層をたどります。
注:
可能な限り一貫性を持たせるため、
シンボリックリンクが参照するファイルのタイプに依存せずに、
ファイルツリーをたどるコマンドに
コマンドラインで指定されるシンボリックリンクだけでなく
ファイルツリーをたどっているときに出会うシンボリックリンクも
追跡させるためには、
例えば、コマンド "chown -LR user slink" は、 "slink" で指されるファイルの所有者を変更します。 "slink" がディレクトリを参照する場合、 chown は "slink" で指されるディレクトリを根とするファイル階層をたどります。 さらに、 chown がたどるファイルツリーの中でシンボリックリンクに出会うと、 そのシンボリックリンクは "slink" と同じ方法で扱われます。
可能な限り一貫性を持たせるため、
デフォルトの動作を指定するには、
デフォルトでファイルツリーをたどらないコマンドにおいては、
ls(1)
と
rm(1)
のコマンドは、これらの規則において例外を持ちます。
rm
コマンドはシンボリックリンクを操作し、
シンボリックリンクが参照するファイルを操作しません。
また、シンボリックリンクを追跡しません。
rm
コマンドは
歴史的なシステムとの互換性を維持するために、
ls
コマンドは少し異なる挙動を示します。
SYMLINK (7) | March 31, 1994 |
総合手引 | セクション 7 | English | オプション |
このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.
“ | Hang in there, people suffering from natural disasters and deadly diseases - we're putting ribbons on our cars as fast as we can | ” |
— Artur Bagyants |