
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
答え1
sedとシンボリックリンクに注意する必要がある1つの理由は、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
--follow-symlinks
より安全な方法でシンボリックリンクを使用するには、sedバージョンがGNU Sedの場合は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
開始が期待どおりに機能しない理由を解決するのに多くの時間を費やす可能性があります。