Estou usando um arquivo python para raspar um link, mas para fazer isso demora um pouco, ele imprime 33
e 66
normalmente 100
e imprime o link para stderr usandosys.write.stderr(var)
Agora, eu quero executar este comandopython file.py | dialog --gauge "Doing stuffs" 10 35 0
e deseja canalizar o stdout (33, 66, 100 para atualizar a porcentagem) para medir e obter o sterr para uma variável.
{
python3 file.py 2>&3 | dialog --gauge "Doing stuffs" 10 35 0;
} 3>&1
este comando executa o diálogo corretamente e, em seguida, imprime o stderr, mas não consigo obter sua saída, a menos que seja executado no subshell. Mas isso fará com que a caixa de diálogo desapareça.
A maneira mais fácil para você seria armazenar o erro padrão em um arquivo e atribuir o conteúdo desse arquivo a uma variável após a conclusão do script.
Se você não quiser usar o arquivo intermediário, aqui está outra maneira (retirada desta resposta , onde você também pode ver a explicação):
Vamos usar esta definição de função, que grava porcentagens em stdout e comentários em stderr , como um substituto para seu
python
programa:Você pode capturar a saída stderr
thing
enquanto ainda apresenta um medidor:Aqui capturamos
thing
o stderr de fd 4 e enviamos a saída dedialog --gauge
temporariamente para fd 3 . Depois de atribuir a variável$info
de fd 4 , redirecionamos fd 3 de volta para stdout . Se você não precisar dessa reatribuição final, poderá simplificar a expressão removendo as chaves externas e o redirecionamento, deixando a exibição do medidor em stderr :Outra alternativa seria algo assim:
Aqui,
dialog
(a barra de progresso) é redirecionado diretamente para o terminal ignorando qualquer outra coisadialog
é enviado para/dev/null
que não capturamos nenhum lixo de lápython
vai paradialog
o pipe como de costume, epython
é redirecionado (fora do grupo) para o "stdout" fornecido pela substituição do comando e capturado pelo shellÉ claro que o redirecionamento para
/dev/tty
significa que a barra de progresso será impressa mesmo que a saída da coisa toda seja redirecionada para outro lugar. Isso pode ou não ser o que você deseja (mas a bagunça dos códigos de controle de terminal quedialog
gera também provavelmente não é algo muito útil em qualquer outro lugar que não seja um terminal).Isso também ocultará quaisquer erros de
dialog
, mas o status de saída de toda a atribuição é o status de saída do último comando no pipeline, para que você possa verificar isso. Ou useset -o pipefail
para ver se algum comando no pipeline falha.Testado com um script como este como
dostuff
: