Comando que passa sua entrada até a saída E executa o comando?

1

Estou tentando usar o programa quote para criar um pequeno script de shell que atualizará os preços das ações a cada segundo. quote tem que acessar a Internet e, portanto, tem um pequeno atraso quando é executado. Preciso limpar a tela toda vez, mas quero limpá-la depois que quote foi concluído e antes de cat imprimir sua saída para que não haja um atraso significativo entre clear e cat :

while true
do
   quote spy gld aapl amzn goog nflx tsla f gm msft | ??? clear | cat
   sleep 1
done

Eu quero que o comando ??? (que é executado depois de quote ter imprimido sua saída, é claro) execute clear e passe a saída de quote direto para a entrada de cat . Que comando faz isso?

    
por sudo 31.10.2014 / 00:49

3 respostas

1

I want to clear after quote has completed and before cat prints its output

Então, o que você está procurando não é executar clear then cat (o que seria fácil: quote … | { clear; cat; } ), porque cat ainda seria iniciado antes que quote fosse concluído. Um pipe não resolve seu problema, pois ele executa o produtor e o consumidor em paralelo. Em vez disso, você precisa armazenar a saída de quote e exibi-la. Armazene a saída de uma substituição de comando em uma variável.

text=$(quote spy gld aapl amzn goog nflx tsla f gm msft)
clear
echo "$text"

Isso remove linhas em branco no final da saída. Se isso não for aceitável, você pode contornar esse recurso imprimindo uma linha extra não vazia no final e removendo-a. O comando echo também manipula algumas strings curtas que começam com - .

text=$(quote spy gld aapl amzn goog nflx tsla f gm msft; echo .)
clear
printf %s "${text%.}"
    
por 31.10.2014 / 02:31
1

Grats em fazê-lo funcionar, mas parece que você está reinventando 'watch'.

Além disso, a consulta em intervalos de um segundo pode ser um pouco excessiva? Eu escolheria 20 segundos ou mais, especialmente quando "assistir" puder mostrar as diferenças entre as execuções.

watch -n 20 -d quote spy gld aapl amzn goog nflx tsla f gm msft
    
por 31.10.2014 / 02:25
0

Isso não é exatamente o que eu pedi, mas faz o trabalho. Eu configurei uma variável para a saída de quote . Eu não pensei nisso no começo porque sou novo no Bash ...

clear
while true
do
   OUTPUT="$(quote spy gld aapl amzn goog nflx tsla f gm msft)"
   clear
   echo "${OUTPUT}"
   sleep 1
done
    
por 31.10.2014 / 00:53