Lendo de STDIN e usando dados imediatamente (enquanto ainda está lendo) ou abrindo um URL com zbar

1

Eu preciso ler as linhas do STDIN e processá-las. Eu poderia fazer algo como:

<print lines to STDOUT> | while read line; do
   <process $line>
done

Mas isso significa que primeiro todas as linhas são impressas e canalizadas e então são processadas. Eu quero processar cada linha imediatamente, eventualmente antes que as próximas linhas sejam enviadas para o STDOUT.

Isso pode ser útil se as linhas devem ser processadas enquanto são geradas (por exemplo, um arquivo de log). Minha tarefa é usar zbar (aviso! A página da web trava o Firefox ...) para escanear vários códigos QR e abrir seus URLs em Raposa de fogo. Se executar zbarcam --raw , a webcam é usada para escanear códigos QR. Se um código QR for encontrado, o URL será impresso no STDOUT imediatamente, mas o zbarcam não será encerrado. Então, eu gostaria de ler esta linha e executar firefox $url ou mais (mas sem esperar por outras URLs).

Eu encontrei uma solução , mas estou pensando se isso não pode ser feito mais fácil. Basicamente, ele escreve a saída de zbarcam em um arquivo temporário e aguarda até que algo seja escrito:

zbarcam --raw > tmpfile &
...
while [[ ! -s $tmp ]] ; do
  sleep 1
done

Isso pode ser feito sem arquivos temporários e sem um loop com sleep 1 ?

    
por lumbric 24.09.2012 / 18:57

3 respostas

3

Sua primeira tentativa funciona:

tail -f temp.file | while read LINE; do firefox $LINE; done

Em seguida, em outro terminal, acrescente ao arquivo temporário para que tail -f imprima uma linha para STDOUT:

echo 'google.com' >> temp.file

Toda vez que você fizer isso, o Firefox irá abrir uma nova aba.

    
por 11.10.2012 / 14:00
2

Depois de tentar um pouco mais, encontrei uma solução parcial:

zbarcam --raw|xargs -L1 firefox

A parte crucial é o parâmetro -L1 , que diz xargs para ler apenas uma única linha. Depois de ler o primeiro código QR, ele roda o firefox. zbar ainda é executado, mas não consigo digitalizar um segundo código QR ( xargs precisa ser chamado pela segunda vez de alguma forma).

    
por 24.09.2012 / 19:31
0

muito, muito perto:

zbarcam --raw | xargs -n 1 chromium-browser

Isso funciona muito bem para mim, cada varredura acaba em uma nova guia.

    
por 19.02.2013 / 14:42