为什么 sed -i 用文件替换符号链接?

为什么 sed -i 用文件替换符号链接?

sed -i在符号链接上应用编辑时,我注意到一个奇怪的行为。文档说-i将进行就地编辑。但是,符号链接会被文件替换。

重现步骤:

cd /tmp
echo blah > foo
ln -s foo bar
sed -i -e 's/ah/ub/' bar
ls -l

将导致:

-rw-rw-r--. 1 arogge   arogge      5 Mar  9 15:07 bar
-rw-rw-r--. 1 arogge   arogge      5 Mar  9 15:07 foo

这是预期的行为还是一个错误sed

答案1

这是预期的行为。

-i/标志--in-place编辑文件的临时副本,然后将该副本移动到原始文件上。

所以当你这样做时:

sed -i 'bla' symlink

sed 正在做的是:

sed 'bla' symlink > temp_file
mv temp_file symlink

因此通过在其位置放置常规文件来破坏符号链接。

信息取自一条评论如何防止 sed -i 破坏符号链接?

答案2

完整列表是否包含这样的内容

lrw-rw-r--. 1 arogge arogge 5 Mar 9 15:07 bar-e -> foo

这是预期的行为。来自 sed 的手册页

-i 扩展名

就地编辑文件,使用指定的扩展名保存备份。

sed 似乎将 -e 解释为 -i 的扩展名。

相关内容