シンボリック リンク ターゲットを更新する方法 (ln -f -s が機能しない)

シンボリック リンク ターゲットを更新する方法 (ln -f -s が機能しない)

私は使用しています

ln -f -s /var/www/html/releases/build1390 アプリ-現在

シンボリック リンク「app-current」を新しい宛先に更新します。ただし、これは機能しません。リンク「app-current」は元の宛先を保持しますが、エラーは発生しません...

リンクを削除して再作成するのではなく、既存のリンクのターゲットを更新するだけです。それは可能ですか?

答え1

それは私にとってはうまくいきます、 の出力は何ですかstrace ln -f -s /var/www/html/releases/build1390 app-current?

ああ、これは参照解除しないように追加する必要があるディレクトリなので-n、これで問題は解決するはずです。-f-f を追加するととにかくリンクが解除されるだけなので、これは本当に便利です。ただし、通常の負荷のシステムでは、おそらく数百ミリ秒速く実行されると思います。

たとえば、arf がすでに /home を指している場合:

strace と-n:

strace ln -n -f -s / arf
...
symlink("/", "arf")           = -1 EEXIST (File exists)
unlink("arf")                           = 0
symlink("/", "arf")           = 0

strace なし-n:

strace ln -f -s / arf
...
write(2, "ln: "..., 4ln: )                  = 4
write(2, "`arf/': cannot overwrite director"..., 34`arf/': cannot overwrite directory) = 34
write(2, "\n"..., 1)                    = 1

したがって、-narf がなければ逆参照されるため、ln はそれを arf として扱います。これは、実際に であるかのように扱われます/。特定の例では、エラーがない場合は、おそらく 内に新しいシンボリック リンクが作成されているので/var/www/html/releases/build1390 app-current、それをクリーンアップする必要があると思います。

答え2

-nまたは--no-dereferenceを使用すると、対象がシンボリックリンクである場合に、その参照が解除されるのを防ぐことができます。または-Tを使用する--no-target-directoryと、対象ファイルがいつも通常のファイルとして扱われます。

これらは、次の例に示すように、わずかに異なる動作を生成します。 がsrc何らかのファイルであり、dirlinkがディレクトリへのシンボリックリンクであり、 がdir実際のディレクトリであるとします。

使用方法-n:

  • ln -sfn src dirlink上書きしdirlinkてリンクするsrc
  • ln -sfn src dirリンクを作成dir/src -> src

使用方法-T:

  • ln -sfT src dirlink上書きしdirlinkてリンクするsrc
  • ln -sfT src dirエラーメッセージが生成されます:ln: ‘dir’: cannot overwrite directory

関連情報