Considérez quelque chose comme:
cat file | command > file
Est-ce une bonne pratique? Cela pourrait-il remplacer le fichier d’entrée en même temps que nous le lisons ou est-il toujours lu en premier en mémoire, puis redirigé vers la seconde commande?
De toute évidence, je peux utiliser les fichiers temporaires comme étape intermédiaire, mais je me demande simplement ..
t=$(mktemp) cat file | command > ${t} && mv ${t} file
Non, ça ne va pas. Toutes les commandes d’un pipeline s’exécutent en même temps et le shell prépare les redirections avant d’exécuter les commandes. Il est donc probable que la commande écrase le fichier avant que cat ne le lise.
Vous avez besoin d’une éponge (1) de moreutils.
Vous pouvez également utiliser quelque chose comme ceci (non recommandé, utilisez des fichiers temporaires explicites dans le code de production):
{ rm file && your_command > file; } < file
Non seulement vous ne devez PAS écrire votre sortie sur votre entrée, mais vous devez également éviter de renvoyer votre sortie à votre entrée.
En traitant de gros fichiers, j’ai essayé
cat *allfastq30 > Sample_All_allfastq30
et il a généré des messages d’erreur:
cat: Sample_All_allfastq30: input file is output file