Sed

sed + update /etc/grub.conf 儘管有這個連結文件

  • March 2, 2017

我讀過那個 sed 命令有時無法編輯連結為的文件

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

那麼使用 sed 是錯誤的嗎

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

或者正確的方法是只在非連結文件上工作?

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

小心 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 usedsymlink 被維護時,sed 操作實際上適用於 file a

因此,在您的範例中,如果您破壞了/etc/grub.conf->之間的符號連結/boot/grub/grub.conf,您會期望您的更改會發生,只是發現它們實際上並沒有被/boot/grub/grub.conf應用於按預期工作。

引用自:https://unix.stackexchange.com/questions/348693