Estoy tratando de sobrescribir un archivo con salida de comando, pero solo si hay alguna salida. Es decir, generalmente quiero
mycommand > myfile
pero si esto sobrescribiera myfile
con datos vacíos, deseo conservar la versión anterior de myfile
. Pensé que algo usando ifne
debería ser posible, a la
mycommand | ifne (cat > myfile)
Pero eso no funciona ...
Un enfoque indirecto
mycommand | tee mytempfile | ifne mv mytempfile myfile
funciona, pero considero que el uso de ese archivo temporal no es elegante.
P: ¿Por qué mi primera idea no funciona? ¿Se puede hacer funcionar? ¿O hay otra solución agradable y quizás completamente diferente para mi problema original?
Respuestas:
Su primer enfoque funciona, solo necesita dar un comando para
ifne
(verman ifne
):Por lo tanto, debe darle un comando para que se ejecute. Ya casi estás allí,
tee
funcionará:Si su comando no produce una gran cantidad de datos, si es lo suficientemente pequeño como para caber en una variable, también puede hacer:
fuente
La solución peatonal:
Es decir, guarde el resultado en un archivo temporal, luego pruebe si está vacío o no. Si no está vacío, copie su contenido sobre su archivo. Al final, elimine el archivo temporal.
Estoy usando en
cat "$tmpfile" >myfile
lugar decp "$tmpfile" myfile
(omv
) para obtener el mismo efecto que habría obtenidomycommand >myfile
, es decir, para truncar el archivo existente y preservar la propiedad y los permisos.Si
$TMPDIR
(utilizado pormktemp
) está en un sistema de archivos montado en memoria, entonces esto no escribiría en el disco de otra manera que no sea cuando se escribe enmyfile
. Además, sería más portátil que usarifne
.fuente