Execução de script para continuar, mesmo se o redirecionamento para um arquivo falhar [fechado]

0

É um cenário típico que redirecionamos saídas de script para um arquivo. Por causa de um problema de permissão ou por qualquer motivo, o arquivo de saída não pode ser criado. (Normalmente, esses são arquivos de log implementados como requisitos do NFR do produto) Agora, por causa disso, a execução do script está sendo bloqueada. Existe uma maneira que, este cenário pode ser evitado, a execução do script ainda deve continuar se o arquivo de saída não puder ser criado.

    
por user1006987 05.11.2018 / 08:15

3 respostas

0

Como o redirecionamento é processado antes que o comando associado seja executado, se o redirecionamento falhar, o comando não será executado.

Então, para

./script.sh >$output

para executar o script com êxito, mesmo que o redirecionamento para o arquivo em $output falhe, primeiro teríamos que detectar se seria possível fazer o redirecionamento manualmente.

O redirecionamento será bem-sucedido se o arquivo de saída já existir e for gravável pelo usuário atual. Ele também seria bem-sucedido se o usuário tiver permissões de execução e gravação no diretório em que $output deve ser criado (e executar permissões em todos os diretórios intermediários no caminho).

Essas duas coisas podem ser testadas por touch :

if ! touch "$output" 2>/dev/null; then
    output=/dev/null
fi

./script.sh >$output

Aqui, redirecionamos a saída para /dev/null se o arquivo de saída padrão não for utilizável. Você pode usar, por exemplo, /dev/stdout no lugar de /dev/null se você, em vez de descartar a saída, quiser ir para a saída padrão.

    
por 05.11.2018 / 16:58
1

Minha recomendação seria usar o subsistema de log que já existe ( syslog ). A ferramenta de linha de comando para acessar isso é logger .

Defina o recurso user com uma prioridade de saída apropriada (erros, avisos, informações, depuração, etc.) e a tag em um rótulo que represente seu programa e pronto:

your_program 2>&1 | logger -t your_program -p user.info
    
por 06.11.2018 / 00:05
1

Você pode usar tee como intermediário em vez de redirecionar diretamente a saída do comando. Não vai parar apenas por causa de uma falha na abertura de um arquivo de saída.

$ cat out.sh
#!/bin/bash
outfile=${1-/dev/null}
echo hello | tee "$outfile"
echo done.
$ touch unwritable; chmod a-w unwritable
$ bash out.sh unwritable 
tee: unwritable: Permission denied
hello
done.

O status de saída do pipeline será o status de saída do último comando, tee . Se você precisar do status de saída da primeira parte do pipeline, poderá usar, por exemplo, A matriz PIPESTATUS do Bash para obtê-lo.

Redirecione a saída de tee para /dev/null se você não quiser uma cópia da saída para a saída padrão do script.

    
por 06.11.2018 / 00:40