Existe-t-il un moyen de faire des liens symboliques perl-i non clobber?

Un ami à moi souligne que si vous le faites:

perl -pi.bak -e 's/foo/bar/' somefile 

quand "somefile" est en fait un lien symbolique, perl fait exactement ce que les docs disent qu'il va faire:

Pour cela, renommez le file d'input, ouvrez le file de sortie par son nom d'origine et select ce file de sortie comme valeur par défaut pour les instructions print (). L'extension, si fournie, est utilisée pour modifier le nom de l'ancien file pour faire une copy de sauvegarde […]

Ce qui a pour résultat un nouveau lien symbolique "somefile.bak" pointant vers le file réel inchangé, et un nouveau file régulier modifié "somefile" avec les changements.

Dans de nombreux cas, suivre le lien symbolique serait le comportement désiré (même si cela laisse l'location correct du file .bak ambigu). Existe-t-il un moyen simple de le faire autrement que de tester les liens symboliques dans un wrapper et de traiter le cas de manière appropriée?

( sed fait la même chose, pour ce que ça vaut.)

Je me request si l'utilité générale de petite sponge («absorber l'input standard et écrire dans un file») de moreutils sera utile dans ce cas et si elle suivra le lien symbolique.

L'auteur décrit l' sponge comme ceci:

Il traite le problème de l'édition des files sur place avec les outils Unix, à savoir que si vous redirigez simplement la sortie vers le file que vous essayez d'éditer, la redirection prend effet (clobber le contenu du file) avant la première command du pipeline contourne la lecture du file. Des commutateurs comme sed -i et perl -i fonctionnent autour de cette option, mais pas toutes les commands que vous pourriez vouloir utiliser dans un pipeline ont une telle option, et vous ne pouvez pas utiliser cette approche avec des pipelines à commands multiples.

J'utilise normalement une éponge un peu comme ça:

 sed '...' file | grep '...' | sponge file 

Si vous savez somefile qu'un somefile est un lien symbolique, vous pouvez fournir explicitement le path d'access complet au file suivant:

perl -pi.bak -e 's/foo/bar/' $(readlink somefile)

De cette façon, le lien symbolique d'origine rest intact puisque le rlocation est maintenant fait directement avec le file original.