이 링크 파일에도 불구하고 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와 심볼릭 링크에 주의해야 하는 한 가지 이유는 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시작이 예상대로 작동하지 않는 이유를 해결하는 데 많은 시간을 소비할 수 있습니다.

관련 정보