Como definir permissões de arquivo específicas ao redirecionar a saída?

7

Esta é provavelmente uma duplicata, mas todas as minhas pesquisas estão levantando questões sobre permissão de erros negados.

Estou executando um comando em um shell bash. Eu quero redirecionar a saída para acrescentar a um arquivo que provavelmente não existe na primeira execução. Eu quero definir o modo de permissões de arquivo específico se o redirecionamento de saída tiver que criar esse arquivo. Existe uma maneira de fazer isso com um comando?

Por exemplo, posso tentar

foo >> /tmp/foo.log 0644

em que 0644 são as permissões com as quais quero que foo.log acabem. A maioria dos comandos que experimentei no bash acabam interpretando 0644 como um argumento adicional para foo .

Tenho a sensação de que isso vai exigir um segundo comando para chmod das permissões antes ou depois de escrever para ele.

Estou usando o GNU bash 4.2.25 e o Ubuntu 12.04, se isso faz diferença - as respostas gerais são preferidas.

    
por Patrick M 21.01.2014 / 17:32

3 respostas

5

Não há como fazer isso enquanto eu conheço, um script simples pode ser a melhor solução.

if [ -e /tmp/foo.log ]; then
    foo >> /tmp/foo.log
else
    foo >> /tmp/foo.log
    chmod 0644 /tmp/foo.log
fi
    
por 21.01.2014 / 17:40
11

Eu sei que é uma pergunta antiga, mas queria adicionar meus dois centavos.

Eu tive a mesma ideia e criei uma solução semelhante a BowlesCR . O problema com sua solução foi que meu comando ( foo ) não funcionaria se eu mudasse o umask antes de executá-lo, então essa é minha opinião sobre o problema:

foo | ( umask 0033; cat >> /tmp/foo.log; )

Aqui, umask afeta somente o redirecionamento para foo.log na subshell. Todo o resto não é afetado.

Um pouco confuso, mas funciona.

    
por 23.09.2014 / 18:01
2

Sem scripts verdadeiros, você pode encadear um pouco:

touch foo.log; chmod 0644 foo.log; foo >> foo.log

Efetivamente semelhante à resposta de Slowki, mas condensada em uma única linha.

A única outra coisa em que consigo pensar é mexer no umask. Melhor fazer isso em um subshell para não poluir o ambiente atual:

(umask 0033 && foo >> foo.log)

Dois problemas com isso.

  1. A Umask não pode aumentar as permissões acima do nível especificado no creat() syscall (0644 parece ser o que o Bash usa).
  2. Isso não alterará as permissões em um arquivo existente (porque você está usando a operadora >> append).
por 21.01.2014 / 19:12