A barra de progresso do Zenity afeta variáveis

2

Oi pessoal Atualmente estou tentando implementar a barra de progresso zenity para o meu loop while, no entanto, notei que minha variável que se destinam a ser incrementado não incrementado. Aqui está um script de teste de amostra que eu tentei:

i=0
p=0

while [ $i -lt 10 ]
do
      i=$[$i + 1]
      echo $i
      p=$[$p + 1]
done | (zenity --progress --title="test" --text="test")
echo "i: $i p: $p"

Percebi que a barra de progresso funcionava, no entanto, a variável p que deveria ser um contador foi afetada pelo zenity. Há algo de errado com o meu código? A variável i deve ecoar o valor para mover a barra de progresso, enquanto a variável p é destinada a outros propósitos. Os valores de p e i são ambos 0 apesar de serem incrementados dentro do loop while.

Espero que haja uma maneira de tornar a variável p e i increment sem remover a barra de progresso do zenity. Não tenho certeza por que, no entanto, o incremento das variáveis funciona depois que a linha (zenity --progress --title="test" --text="test") é removida

Adição

Como usar as variáveis i e p após o término da barra de progresso? E mais uma pergunta, é necessário incluir o loop while com () ?

Obrigado por qualquer ajuda!

    
por pikachu 02.12.2013 / 15:40

2 respostas

2

Incremento e tudo parece estar absolutamente bem. Mas todos os incrementos estão ocorrendo dentro de um subshell que está sendo passado para zenity . Esta é a razão pela qual você não está obtendo as alterações quando você echo delas estão fora da subshell. Estou usando seu script, adicionando apenas algo para imprimir as variáveis dentro da janela do while loop no zenity . Para saber mais sobre a sintaxe do diálogo de progresso do zenity, consulte a página de ajuda do gnome . Execute o script abaixo e veja o resultado,

#!/bin/bash
i=0
p=0
(while [ $i -lt 100 ]
do
    i=$[$i + 10]
    echo $i ; sleep 1
    echo "#  now i is $i and p=$p"
    p=$[$p + 1]
done) | zenity --progress --title="test" --text="test"
echo "i: $i p: $p"

Eu alterei o incremento de i para 10, pois i será usado para aumentar a barra de progresso e usou sleep 1 para tornar o progresso perceptível.

Observação: Embora o valor esteja mostrando a ser incrementado em zenity pop-up. Está mostrando para ser inalterado no terminal, i: 0 p: 0

Espero que isso seja útil.

Como usar variáveis subshell fora

  

O shell pai não pode usar variáveis de sua sub-shell. Você pode encontrar mais sobre subshell aqui . Mas você sempre pode escrever variáveis do subshell em um arquivo temporário para seu pai ler. Pode não ser o melhor dos caminhos, mas funciona.

#!/bin/bash
..
(while [ $i -lt 100 ]
do
    ...
    ...
done
echo "p=$(echo $p)" > tmp
echo "i=$(echo $i)" >> tmp
) | zenity --progress --title="test" --text="test"
. tmp
rm tmp
echo "i: $i p: $p"

Agora ele vai aparecer no terminal como i: 100 p: 10 para você usá-los ao seu gosto. E como você perguntou na última parte, não é o loop while, mas sim o subshell. É costume colocar o conteúdo da subshell dentro de parênteses.

    
por souravc 02.12.2013 / 19:53
1

A substituição de processos pode impedir que sub-pacotes irritantes sejam criados, mas a sintaxe é um pouco estranha:

$ k=0; for x in a b; do ((k++)); done | zenity --progress; echo "$k"

→ 0 (não OK)

$ k=0; for x in a b; do ((k++)); done > >(zenity --progress); echo "$k"

→ 2 (OK)

O que eu gosto nisso é que você geralmente não precisa modificar muito seu script para que ele funcione corretamente. No entanto, alguns shells exóticos podem estar perdendo esse recurso. Para o Bash, consulte a seção "Substituição do processo" do manual.

Com um código mais próximo do exemplo da pergunta inicial:

  i=0
  p=0

  while [ $i -lt 10 ]
  do
        i=$[$i + 1]
        echo $((10 * i))
        sleep 0.1
        p=$[$p + 1]
  done > >(zenity --progress --title="test" --text="test")
  echo "i: $i p: $p"

(adicionei um sleep para tornar o progresso mais perceptível e faço eco de dez vezes i para ter um 100 ao chegar ao final do loop.)

    
por Alice M. 12.05.2018 / 15:42