Sed
sed + update /etc/grub.conf 儘管有這個連結文件
我讀過那個 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-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
symlink 被維護時,sed 操作實際上適用於 filea
。因此,在您的範例中,如果您破壞了
/etc/grub.conf
->之間的符號連結/boot/grub/grub.conf
,您會期望您的更改會發生,只是發現它們實際上並沒有被/boot/grub/grub.conf
應用於按預期工作。