このリンクファイルにもかかわらず、sed +アップデート/etc/grub.conf

このリンクファイルにもかかわらず、sed +アップデート/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

ベストアンサー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開始が期待どおりに機能しない理由を解決するのに多くの時間を費やす可能性があります。

おすすめ記事