.
é um metacaractere de expressão regular em sed
, que corresponde a qualquer caractere único. Como você insere o caminho $from
diretamente na expressão regular, o .
está lá como se você tivesse escrito:
sed "s@.@../pool/@"
você mesmo. Que substitui qualquer caractere único, uma vez, com " ../pool/
" , então tem o efeito de deletar o primeiro caractere e inserir "../pool/" em seu lugar.
Se você executar o comando readlink
manualmente, verá que ./
não faz parte do conteúdo do link - seu ls
mostra o mesmo.
Você precisará, pelo menos, de um caso especial " .
" no seu script, pois ele pode ou não estar presente no conteúdo do link. Uma opção é usar readlink -f
no link e .
- que lhe dará caminhos absolutos ambos - mas existem opções mais simples se você tiver apenas um caso para lidar.
Se você estiver em bash
, pode sair sem sed
usando expansão básica de parâmetro :
ln -sf "${a/$from/$to}" "$i"
Isso substituirá a expansão de $from
pela expansão de $to
em $a
, com .
tratado literalmente (embora *
e outros shell metacaracteres sejam usados - realmente deve ser "${a/"$from"/"$to"}"
para evitar isso). Esta é uma maneira mais limpa e simples de fazer isso em geral.