シンボリックリンクの私の基本的な理解は、それが別のファイルへの文字列パスを含む特別なファイルであるということです。カーネルのVFSは多くを抽象化しますが、シンボリックリンクを編集できないように見える理由はありますか?
つまり、シンボリックリンクを編集できますか?そうでなければなぜならないのですか?
いろいろな方法があることを理解する変えるシンボリックリンク(現在の回答セクションには2つの選択肢があります)が、代替がシンボリックリンクを処理する唯一の方法であるように見える理由の説明を聞くのは興味深いでしょう。なぜ彼らが指す場所を変更できないのですか?
答え1
これが-f
単に自動交換を行うということを考えるとアトミック交換が可能ですmv -T
(/loc.../linkがディレクトリの場合でも-Tが機能します)。:
ln -s /location/to/link linkname
# ...
ln -s /location/to/link2 newlink
mv -T newlink linkname
linkname
プロセス全体にアクセスできます。
答え2
編集とは、指すファイルを変更することを意味する場合は、次のことができます。
$ ln -s .bashrc test
$ ls -al test
lrwxrwxrwx 1 pascal pascal 7 2009-09-23 17:12 test -> .bashrc
$ ln -s .profile test
ln: creating symbolic link `test': File exists
$ ln -s -f .profile test
$ ls -al test
lrwxrwxrwx 1 pascal pascal 8 2009-09-23 17:12 test -> .profile
引数-f
()をlnに渡すと、以前のシステムコールが--force
呼び出されます。unlink()
symlink()
から抜粋スタックオーバーフロー回答。
答え3
シンボリックリンクは原子的に変更する必要があります。途中で書くとうまくいきません。シンボリックリンクの内容は非常に小さいので(Linuxでは最大4095文字:ファイルパスの最大長)、カーネルレベルでシンボリックリンクの一部を編集することはほとんど意味がありません。したがって、カーネルはシンボリックリンクを編集するためのインタフェースを提供せず、新しいシンボリックリンクを作成するためのインタフェース、システムコールsymlink
(およびファイルを削除するための一般的なインタフェースunlink
)のみを提供します。
システムsymlink
コールは新しいシンボリックリンクのみを生成し、既存のファイルは削除しません。これは面倒open
ですが(新しいファイルを作成したり、既存のファイルを切り捨てることはできますが、既存のファイルを新しく作成したファイルに置き換えることはできません)、などのファイルを作成する他のシステムコールと一致しますmkdir
。
シェルではあなたは見つけました。ln
、このコマンドを使用してシンボリックリンクを自動的に変更することはできませんが(古いファイルln -sf
のリンクを解除してシンボリックリンクを作成する)、最初に一時名でシンボリックリンクを作成してから所定の位置に移動します。
tmp=$(TMPDIR=$(dirname -- "$link") mktemp)
ln -sf -- "$target" "$tmp"
mv -f "$tmp" "$link"
答え4
完了(過去)の結果としてリンク名が存在すると仮定します。
ln -s /the/path/to/a/file linkname
これにより、次の3つの方法でシンボリックリンクを変更できます。
-f
ディレクトリに対しても ln を強制的に使用します-n
(inode は再利用可能)。ln -sfn /some/new/path linkname
シンボリックリンクを削除して新しいリンクを作成します(ディレクトリの場合でも)。
rm linkname; ln -s /some/new/path linkname
新しいシンボリックリンクを作成すると
mv
変更されます(ディレクトリの場合でも原子的)。ln -s /some/new/path newlinkname mv -fT newlinkname linkname # linkname remains after the command