L'exemple que vous avez suggéré (ci-dessous) ne fonctionne pas, car vous seriez en train de lire et d'écrire dans le même fichier simultanément.
$ cat filename | sort | uniq > filename
L'idée avec un tuyau ou une redirection est que la commande à gauche et à droite de chaque tuyau ou redirection s'exécute simultanément, en parallèle. La commande de droite traite les informations telles qu'elles leur sont transmises par la commande de gauche, tandis que la commande de gauche est toujours en cours d'exécution.
Pour que votre scénario fonctionne, la commande qui lit à partir du fichier doit se terminer avant que la commande qui écrit dans le fichier ne commence. Pour que cela fonctionne, vous devez d'abord rediriger la sortie vers un emplacement temporaire, puis une fois terminé, renvoyez-la de l'emplacement temporaire dans le fichier.
Une meilleure façon de le faire est essentiellement comme dans votre exemple précédent, où vous redirigez vers un fichier temporaire, puis renommez ce fichier à l'original (sauf que vous n'avez pas besoin de supprimer le fichier d'abord, car le déplacement supprime toute cible existante) .
$ cat filename | sort | uniq > result
$ mv -f result filename
Vous pouvez également l'enregistrer dans une variable de chaîne, sauf que cela ne fonctionne que lorsque les données sont suffisamment petites pour toutes tenir en mémoire à la fois.
echo $(cat filename | sort | uniq > result) > filename
ou quelque chose ? Juste en passant, je n'ai pas le temps de l'essayer.