linux - redirigir - ¿Está bien utilizar el mismo archivo de entrada como salida de un comando canalizado?
redireccionar la salida a un archivo linux (3)
No solo NO debe escribir su salida a su entrada, sino que también debe evitar enviar su salida de vuelta a su entrada.
Cuando trato con archivos grandes, lo intenté
cat *allfastq30 > Sample_All_allfastq30
y generó mensajes de error:
cat: Sample_All_allfastq30: input file is output file
Considera algo como:
cat file | command > file
¿Es esta una buena práctica? ¿Podría esto sobreescribir el archivo de entrada al mismo tiempo que lo estamos leyendo, o siempre se lee primero en la memoria y luego se canaliza al segundo comando?
Obviamente, puedo usar archivos temporales como paso intermedio, pero me pregunto ...
t=$(mktemp)
cat file | command > ${t} && mv ${t} file
No, no está bien. Todos los comandos en una canalización se ejecutan al mismo tiempo, y el shell prepara las redirecciones antes de ejecutar los comandos. Por lo tanto, es probable que el comando sobrescriba el archivo antes de que cat lo lea.
Necesitas sponge(1) de moreutils.
También puede usar algo como esto (no recomendado, use archivos temporales explícitos en el código de producción):
{ rm file && your_command > file; } < file