Saya tahu ini pertanyaan lama, tetapi saya ingin menambahkan dua sen saya.
Saya memiliki ide yang sama dan menghasilkan solusi yang mirip dengan BowlesCR. Masalah dengan solusinya adalah perintah saya (foo
) tidak akan berfungsi jika saya mengubah umask sebelum menjalankannya, jadi inilah masalah saya:
foo | ( umask 0033; cat >> /tmp/foo.log; )
Di sini, umask
hanya memengaruhi pengalihan ke foo.log
di subkulit. Segala sesuatu yang lain tetap tidak terpengaruh.
Agak berbelit-belit, tetapi berhasil.
Tanpa skrip yang benar, Anda dapat membuat rantai sedikit:
touch /tmp/foo.log; chmod 0644 /tmp/foo.log; foo >> /tmp/foo.log
Sangat mirip dengan jawaban Slowki, tetapi diringkas menjadi satu baris.
Satu-satunya hal lain yang dapat saya pikirkan adalah mengutak-atik umask. Sebaiknya lakukan ini dalam subkulit agar tidak mencemari lingkungan saat ini:
(umask 0033 && foo >> /tmp/foo.log)
Namun, ada dua masalah dengan itu.
- Umask tidak dapat menaikkan izin di atas tingkat yang ditentukan dalam
creat()
syscall (tampaknya 0666 yang digunakan Bash). - Ini tidak akan mengubah izin pada file yang ada (karena
umask
hanya berlaku untuk pembuatan file ).
Tidak ada cara untuk melakukannya sambil menyalurkan sejauh yang saya tahu, skrip sederhana mungkin merupakan solusi terbaik.
if [ -e /tmp/foo.log ]; then
foo >> /tmp/foo.log
else
foo >> /tmp/foo.log
chmod 0644 /tmp/foo.log
fi