Ich weiß, es ist eine alte Frage, aber ich wollte meinen Senf hinzufügen.
Ich hatte die gleiche Idee und kam auf eine ähnliche Lösung wie BowlesCR. Das Problem mit seiner Lösung war, dass mein Befehl (foo
) würde nicht funktionieren, wenn ich die umask vor dem Ausführen geändert hätte, also ist dies meine Lösung des Problems:
foo | ( umask 0033; cat >> /tmp/foo.log; )
Hier, umask
wirkt sich nur auf die Umleitung auf foo.log
aus in der Unterschale. Alles andere bleibt unberührt.
Etwas umständlich, aber es funktioniert.
Ohne echtes Scripting können Sie ein bisschen verketten:
touch /tmp/foo.log; chmod 0644 /tmp/foo.log; foo >> /tmp/foo.log
Effektiv ähnlich wie Slowkis Antwort, aber zu einem Einzeiler zusammengefasst.
Das einzige andere, was mir einfällt, ist das Basteln mit der umask. Am besten tun Sie dies in einer Unterschale, damit die aktuelle Umgebung nicht verschmutzt wird:
(umask 0033 && foo >> /tmp/foo.log)
Allerdings zwei Probleme damit.
- Umask kann die Berechtigungen nicht über die in
creat()
angegebene Stufe erhöhen syscall (0666 scheint das zu sein, was Bash verwendet). - Dadurch werden die Berechtigungen für eine vorhandene Datei nicht geändert (weil
umask
gilt nur für die Erstellung von Dateien ).
Soweit ich weiß, gibt es keine Möglichkeit, dies beim Piping zu tun, ein einfaches Skript könnte die beste Lösung sein.
if [ -e /tmp/foo.log ]; then
foo >> /tmp/foo.log
else
foo >> /tmp/foo.log
chmod 0644 /tmp/foo.log
fi