古い質問であることは承知していますが、2 セント追加したいと思います。
私も同じ考えで、BowlesCR に似た解決策を思いつきました。彼の解決策の問題点は、私のコマンド (foo
) ) を実行する前に umask を変更すると機能しないため、この問題に対する私の見解は次のとおりです。
foo | ( umask 0033; cat >> /tmp/foo.log; )
ここでは、umask
foo.log
へのリダイレクトのみに影響します サブシェルで。他のすべては影響を受けません。
少し複雑ですが、うまくいきます。
真のスクリプティングがなければ、少し連鎖することができます:
touch /tmp/foo.log; chmod 0644 /tmp/foo.log; foo >> /tmp/foo.log
Slowki の答えと効果的に似ていますが、ワンライナーに凝縮されています。
私が考えることができる唯一の他のことは、umask をいじることです。現在の環境を汚染しないように、サブシェルでこれを行うのが最善です:
(umask 0033 && foo >> /tmp/foo.log)
ただし、それには 2 つの問題があります。
<オール>creat()
で指定されたレベルを超えてアクセス許可を上げることはできません syscall (0666 は Bash が使用しているようです)。umask
ファイルの作成にのみ適用されます ).私の知る限り、パイプ中にそれを行う方法はありません。単純なスクリプトが最善の解決策かもしれません。
if [ -e /tmp/foo.log ]; then
foo >> /tmp/foo.log
else
foo >> /tmp/foo.log
chmod 0644 /tmp/foo.log
fi