sed + 更新 /etc/grub.conf 尽管有这个链接文件

sed + 更新 /etc/grub.conf 尽管有这个链接文件

我读到 sed 命令有时无法编辑链接文件

lrwxrwxrwx 1 root root  Aug 31  2008 /etc/grub.conf -> ../boot/grub/grub.conf

那么使用 sed as 是错误的吗

sed -i 's/find/replace/g' /etc/grub.conf

或者正确的方法是仅适用于非链接文件,如?

sed -i 's/find/replace/g' /boot/grub/grub.conf

答案1

小心使用 sed 和符号链接的原因之一是,当 sed 就地修改文件时,它将破坏链接并创建一个新文件。例如:

bash-[622]$ echo abc > a
bash-[623]$ ln -s a b
bash-[624]$ ls -la
total 32
drwxr-xr-x   2 tim      staff        233 Mar  2 10:31 ./
drwxrwxrwt   4 root     sys          612 Mar  2 10:29 ../
-rw-r--r--   1 tim      staff          4 Mar  2 10:31 a
lrwxrwxrwx   1 tim      staff          1 Mar  2 10:31 b -> a
bash-[625]$ cat a
abc
bash-[626]$ cat b
abc
bash-[627]$ sed -i 's/abc/def/g' b
bash-[628]$ ls -la
total 32
drwxr-xr-x   2 tim      staff        233 Mar  2 10:31 ./
drwxrwxrwt   4 root     sys          612 Mar  2 10:29 ../
-rw-r--r--   1 tim      staff          4 Mar  2 10:31 a
-rw-r--r--   1 tim      staff          4 Mar  2 10:31 b
bash-[629]$ cat a
abc
bash-[630]$ cat b
def

为了以更安全的方式使用符号链接,如果您的 sed 版本是 GNU Sed,则可以使用--follow-symlinkssed 选项。

bash-[632]$ echo abc > a
bash-[633]$ ln -s a b
bash-[634]$ ls -la
total 32
drwxr-xr-x   2 tim      staff        233 Mar  2 10:33 ./
drwxrwxrwt   4 root     sys          612 Mar  2 10:32 ../
-rw-r--r--   1 tim      staff          4 Mar  2 10:33 a
lrwxrwxrwx   1 tim      staff          1 Mar  2 10:33 b -> a
bash-[635]$ cat a
abc
bash-[636]$ cat b
abc
bash-[637]$ sed --follow-symlinks -i 's/abc/def/g' b
bash-[638]$ ls -la
total 32
drwxr-xr-x   2 tim      staff        233 Mar  2 10:33 ./
drwxrwxrwt   4 root     sys          612 Mar  2 10:32 ../
-rw-r--r--   1 tim      staff          4 Mar  2 10:33 a
lrwxrwxrwx   1 tim      staff          1 Mar  2 10:33 b -> a
bash-[639]$ cat a
def
bash-[640]$ cat b
def

正如您所看到的,当 时--follow-symlinks is used,符号链接被维护,并且 sed 操作实际上适用于文件a

/etc/grub.conf因此,在您的示例中,如果您破坏了->之间的符号链接/boot/grub/grub.conf,您会期望发生更改,结果却发现它们实际上并未应用于/boot/grub/grub.conf,并且您可能会花费大量时间来排除启动失败的原因按预期工作。

相关内容