Sé que es una vieja pregunta, pero quería agregar mis dos centavos.
Tuve la misma idea y se me ocurrió una solución similar a BowlesCR. El problema con su solución fue que mi comando (foo
) no funcionaría si cambiara el umask antes de ejecutarlo, así que esta es mi opinión sobre el problema:
foo | ( umask 0033; cat >> /tmp/foo.log; )
Aquí, umask
solo afecta la redirección a foo.log
en la subcapa. Todo lo demás no se ve afectado.
Un poco complicado, pero funciona.
Sin secuencias de comandos verdaderas, puede encadenar un poco:
touch /tmp/foo.log; chmod 0644 /tmp/foo.log; foo >> /tmp/foo.log
Efectivamente similar a la respuesta de Slowki, pero condensada en una sola línea.
Lo único que se me ocurre es jugar con el umask. Es mejor hacer esto en una subcapa para que no contamine el entorno actual:
(umask 0033 && foo >> /tmp/foo.log)
Sin embargo, hay dos problemas con eso.
- Umask no puede aumentar los permisos por encima del nivel especificado en el
creat()
syscall (0666 parece ser lo que usa Bash). - Esto no cambiará los permisos en un archivo existente (porque
umask
se aplica solo a la creación del archivo ).
Hasta donde yo sé, no hay forma de hacerlo mientras se canaliza, un script simple podría ser la mejor solución.
if [ -e /tmp/foo.log ]; then
foo >> /tmp/foo.log
else
foo >> /tmp/foo.log
chmod 0644 /tmp/foo.log
fi