20

我想从 bash 脚本中更改符号链接的目标。问题是符号链接非常重要(它是/bin/sh, 即),我会以这样的方式来做:

  1. 删除旧目标后,新目标将立即可用,即不会有任何东西会注意到它的消失,
  2. 更改将不可能在中间失败,即让用户删除符号链接并且没有新的符号链接。

我想了两种方法。要么使用普通ln

ln -fs /bin/bash /bin/sh

或使用mv

ln -s /bin/bash /bin/sh.new
mv /bin/sh.new /bin/sh

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

4

2 回答 2

23

重命名 ( mv) 是原子操作;创建新符号链接不是(删除旧符号链接;创建新符号链接)。所以你应该使用mv

$ ln -s new current_tmp && mv -Tf current_tmp current

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

于 2009-09-06T09:03:32.860 回答
-1

看起来(从手册页)ln -f在创建新符号链接之前取消链接符号链接,这意味着这mv是更好的选择。

但是,我强烈建议不要链接/bin/shbash. 许多脚本使用:

#!/bin/sh

并且假设 shell 是经典的 Bourne shell。如果改为运行bash,您很容易在脚本假定的sh内容与bash 实际执行的内容之间产生模糊的不兼容性。这些几乎是不可能追踪的。

于 2009-09-06T09:04:50.283 回答