sed + update /etc/grub.conf apesar deste arquivo de link

0

Eu li que o comando sed em algum momento não pode editar arquivos que são links como

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

então é errado usar sed como

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

ou o caminho certo é trabalhar apenas no arquivo não link como?

sed -i 's/find/replace/g' /boot/grub/grub.conf
    
por yael 02.03.2017 / 16:12

1 resposta

2

Um motivo para ter cuidado com sed e links simbólicos, é que quando sed modifica um arquivo no local, ele destruirá o link e criará um novo arquivo. Por exemplo:

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

Para trabalhar com links simbólicos de uma maneira mais segura, se sua versão do sed for GNU Sed, você pode usar a opção --follow-symlinks de 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

Como você pode ver, quando --follow-symlinks is used , o link simbólico é mantido, e a operação sed realmente se aplica ao arquivo a .

Então, no seu exemplo, se você quebrou o link simbólico entre /etc/grub.conf - > /boot/grub/grub.conf , você esperaria que suas alterações ocorressem, apenas para descobrir que elas não estavam sendo aplicadas a /boot/grub/grub.conf , e você poderia gastar um tempo significativo para solucionar problemas porque sua inicialização não está funcionando conforme o esperado.

    
por 02.03.2017 / 16:44