我想在bash脚本中更改符号链接的目标。问题是符号链接非常重要(它是/bin/sh
,即),我想以时尚的方式做到:
我想到了两种方法。使用普通ln
:
ln -fs /bin/bash /bin/sh
或使用mv
:
ln -s /bin/bash /bin/sh.new
mv /bin/sh.new /bin/sh
哪一个更符合我的需求?是否有可能其中一个会尝试替换符号链接目标而不是符号链接本身?
答案 0 :(得分:22)
重命名(mv
)是一个原子操作;创建一个新的符号链接不是(删除旧的符号链接;创建一个新的符号链接)。所以你应该使用mv
:
$ ln -s new current_tmp && mv -Tf current_tmp current
这是一个blog post讨论这个问题。另外,如果您担心会发生什么,为什么不首先在非关键符号链接上尝试呢?
答案 1 :(得分:-1)
看起来(从手册页)ln -f
在创建符号链接之前取消链接符号链接,这意味着mv
是更好的选择。
但是,我强烈建议反对将/bin/sh
与bash
相关联。许多脚本使用:
#!/bin/sh
并且假设shell是经典的Bourne shell而编写。如果要运行bash
,则可能很容易在脚本假定sh
执行的内容与bash
实际之间的内容之间产生模糊的不兼容性。这几乎是不可能追查的。