我读到 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-symlinks
sed 选项。
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
,并且您可能会花费大量时间来排除启动失败的原因按预期工作。