Estoy tratando de sobrescribir un archivo con salida de comando, pero solo si hay alguna salida. Es decir, generalmente quiero
mycommand > myfilepero si esto sobrescribiera myfilecon datos vacíos, deseo conservar la versión anterior de myfile. Pensé que algo usando ifnedebería ser posible, a la
mycommand | ifne (cat > myfile) Pero eso no funciona ...
Un enfoque indirecto
mycommand | tee mytempfile | ifne mv mytempfile myfilefunciona, 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í,
teefuncionará: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" >myfilelugar 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