Je sais que c'est une vieille question, mais je voulais ajouter mon grain de sel.
J'ai eu la même idée et j'ai trouvé une solution similaire à BowlesCR. Le problème avec sa solution était que ma commande (foo
) ne fonctionnerait pas si je modifiais le umask avant de l'exécuter, voici donc mon point de vue sur le problème :
foo | ( umask 0033; cat >> /tmp/foo.log; )
Ici, umask
n'affecte que la redirection vers foo.log
dans la sous-couche. Tout le reste reste inchangé.
Un peu compliqué, mais ça marche.
Sans véritable script, vous pouvez enchaîner un peu :
touch /tmp/foo.log; chmod 0644 /tmp/foo.log; foo >> /tmp/foo.log
Effectivement similaire à la réponse de Slowki, mais condensée en une seule ligne.
La seule autre chose à laquelle je peux penser est de bricoler avec l'umask. Le mieux est de le faire dans un sous-shell pour ne pas polluer l'environnement actuel :
(umask 0033 && foo >> /tmp/foo.log)
Deux problèmes avec cela, cependant.
- Umask ne peut pas augmenter les autorisations au-dessus du niveau spécifié dans le
creat()
syscall (0666 semble être ce que Bash utilise). - Cela ne changera pas les permissions sur un fichier existant (car
umask
s'applique uniquement à la création de fichier ).
Pour autant que je sache, il n'y a aucun moyen de le faire pendant la canalisation, un simple script pourrait être la meilleure solution.
if [ -e /tmp/foo.log ]; then
foo >> /tmp/foo.log
else
foo >> /tmp/foo.log
chmod 0644 /tmp/foo.log
fi