替换重要的符号链接'安全'

Mic*_*rny 20 bash symlink

我想从bash脚本中更改符号链接的目标.问题是符号链接非常重要(/bin/sh就是这样),我想以时尚的方式做到:

  1. 删除旧目标后立即可以使用新目标,即不会有任何东西会注意到它消失,
  2. 改变将不会在中间失败,即离开用户删除了符号链接而没有新的符号链接.

我想到了两种方法.使用普通ln:

ln -fs /bin/bash /bin/sh
Run Code Online (Sandbox Code Playgroud)

或使用mv:

ln -s /bin/bash /bin/sh.new
mv /bin/sh.new /bin/sh
Run Code Online (Sandbox Code Playgroud)

哪一个更适合我的需求?是否有可能其中一个会尝试替换符号链接目标而不是符号链接本身?

ire*_*ses 23

Renaming(mv)是一个原子操作; 创建一个新的符号链接不是(删除旧的符号链接;创建一个新的符号链接).所以你应该使用mv:

$ ln -s new current_tmp && mv -Tf current_tmp current
Run Code Online (Sandbox Code Playgroud)

这是一篇讨论此事的博客文章.另外,如果您担心会发生什么,为什么不先在非关键符号链接上尝试呢?