Est-il correct d’utiliser le même fichier d’entrée que la sortie d’une commande de canalisation?

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