So che è una vecchia domanda, ma volevo aggiungere i miei due centesimi.
Ho avuto la stessa idea e ho trovato una soluzione simile a BowlesCR. Il problema con la sua soluzione era che il mio comando (foo
) non funzionerebbe se cambiassi umask prima di eseguirlo, quindi questa è la mia opinione sul problema:
foo | ( umask 0033; cat >> /tmp/foo.log; )
Qui, umask
riguarda solo il reindirizzamento a foo.log
nella subshell. Tutto il resto rimane inalterato.
Un po' contorto, ma funziona.
Senza un vero scripting, puoi concatenare un po':
touch /tmp/foo.log; chmod 0644 /tmp/foo.log; foo >> /tmp/foo.log
Effettivamente simile alla risposta di Slowki, ma condensata in una battuta.
L'unica altra cosa che mi viene in mente è armeggiare con l'umask. Meglio farlo in una subshell in modo da non inquinare l'ambiente attuale:
(umask 0033 && foo >> /tmp/foo.log)
Due problemi con questo, però.
- Umask non può aumentare i permessi oltre il livello specificato in
creat()
syscall (0666 sembra essere quello usato da Bash). - Questo non cambierà i permessi su un file esistente (poiché
umask
si applica solo alla creazione del file ).
Non c'è modo di farlo durante il pipe, per quanto ne so, un semplice script potrebbe essere la soluzione migliore.
if [ -e /tmp/foo.log ]; then
foo >> /tmp/foo.log
else
foo >> /tmp/foo.log
chmod 0644 /tmp/foo.log
fi