Vím, že je to stará otázka, ale chtěl jsem přidat své dva centy.
Měl jsem stejný nápad a přišel s řešením podobným BowlesCR. Problém s jeho řešením byl, že můj příkaz (foo
) by nefungovalo, kdybych změnil umask před jeho spuštěním, takže toto je můj názor na problém:
foo | ( umask 0033; cat >> /tmp/foo.log; )
Zde umask
ovlivňuje pouze přesměrování na foo.log
v podskořápce. Vše ostatní zůstává nedotčeno.
Trochu zamotané, ale funguje to.
Bez skutečného skriptování můžete trochu řetězit:
touch /tmp/foo.log; chmod 0644 /tmp/foo.log; foo >> /tmp/foo.log
Účinně podobné Slowkiho odpovědi, ale zhuštěné do jednoho řádku.
Jediná další věc, která mě napadá, je pohrávat si s umask. Nejlepší je to udělat v subshell, aby to neznečišťovalo aktuální prostředí:
(umask 0033 && foo >> /tmp/foo.log)
S tím jsou ale dva problémy.
- Umask nemůže zvýšit oprávnění nad úroveň specifikovanou v
creat()
syscall (zdá se, že Bash používá 0666). - To nezmění oprávnění k existujícímu souboru (protože
umask
platí pouze pro vytváření souboru ).
Pokud je mi známo, neexistuje způsob, jak to udělat během potrubí. Nejlepším řešením může být jednoduchý skript.
if [ -e /tmp/foo.log ]; then
foo >> /tmp/foo.log
else
foo >> /tmp/foo.log
chmod 0644 /tmp/foo.log
fi