Redirecionamento com comandos aninhados

4

Estou executando um $command , em uma instância de uma tela, como um usuário diferente.
Ele é executado pelo equivalente desse comando (mais detalhado na parte inferior):

su $USERNAME -c "screen -dmS $SCREENNAME $COMMAND"

e isso funciona muito bem. O problema é que eu quero redirecionar a saída de $COMMAND para algum arquivo de log (por exemplo, $LOGFILE ).

Apenas adicionando > $LOGFILE ao final parece ler screen em vez de $COMMAND , então estou perplexo com o que devo fazer. Eu tentei agrupá-lo com parênteses e chaves, mas isso causou erros, então eu provavelmente não estava fazendo isso corretamente.

Então, como posso redirecionar a saída de $COMMAND para $LOGFILE ?

O código que estou executando é "equivalente" a isto:

execute() {
  su $USERNAME -c "$*"
}
COMMAND="$SOMEDIR/$SOMEPROG $SOMEARGS"
execute screen -dmS $SCREENNAME $COMMAND
    
por Mingwei Samuel 17.01.2015 / 09:17

1 resposta

2

O problema é que nem todos os recursos de análise de shell são chamados se você passar o comando diretamente para screen . Portanto, a solução é passar diretamente o comando para um shell, que o analisa conforme o esperado.

Por exemplo, supondo que você use o bash:
su $USERNAME -c "screen -dmS $SCREENNAME bash -c \"$COMMAND > $LOGFILE\""

(Os parênteses escapados são para que o comando seja passado para bash como um todo, caso contrário, o problema com o redirecionamento da saída de screen e não com a saída de $COMMAND surgiria novamente)

    
por 17.01.2015 / 10:06

Tags