Armazena saída de shell atrasada para variável?

1

Eu tenho um script que armazena a saída de um comando dentro de uma variável como esta:

my_var = $ (comando)

No entanto, parte da saída não está sendo armazenada na variável, estou assumindo porque está atrasada ... Tenho certeza de que ela está atrasada porque gera a linha que eu quero para a tela depois que ela armazenou a saída na variável e eu tentei processá-lo ...

[EDITAR] IMPORTANTE! Acontece que a saída estava indo para stderr [/ EDIT]

Como faço para esperar pelo código de saída (quando é feito 100% de saída) antes de armazenar a saída na variável?

Eu não postei um exemplo porque eu pensei que os usuários iriam reclamar que é nefasto, mas não é, e estou executando o script em meus próprios servidores. Exemplo conforme solicitado:

# Grab the output, so we can check for error... If error then retry same password after wait time
outpt="$(hydra -l $hydra_user -P $tmp_passwds $hydra_all_params $hydra_host $hydra_module)"

# Grep for "ssh protocol error" line
banln=$(echo "$outpt" | grep 'ssh protocol error')

# Show ban status, update wait_time
if [ "$banln" != "" ];then
    echo "[STATUS] Oops, we got banned! (increasing wait_time + 1 second)"
wait_time=$wait_time+1

# Start retry procedure until not banned

fi

O problema neste exemplo é que a linha que estou procurando (erro de protocolo [ERROR] ssh) parece vir após a saída do comando ser armazenada na variável

    
por kthx 18.03.2015 / 01:39

1 resposta

2

A menos que esse processo esteja se baseando ou bifurcando, não seria devido ao atraso. Você pode verificar isso com um teste rápido:

# FOO=$(sleep 10; echo whee;); echo $FOO
whee

Este comando não é concluído até que sleep termine a execução e a mensagem enviada para saída padrão seja armazenada com êxito na variável. A partir disso, podemos supor algumas coisas:

  • A variável não é armazenada até que o comando seja concluído.
  • STDOUT permanece conectado pela duração total do comando.

Neste ponto, uma das duas coisas está acontecendo aqui:

  • A mensagem não está sendo gravada no STDOUT: provavelmente foi escrita em STDERR.
  • Na verdade, o comando está sendo concluído. (backgrounded, bifurcou um subprocesso, etc.)

Geralmente o problema é o primeiro.

    
por 18.03.2015 / 02:28