tailf output como parâmetro de script

3

Por que é quando eu deixo o seguinte tailf funcionando:

tailf /var/log/z-way-server.log | grep --line-buffered device-info | gawk 'BEGIN { FS = "\"" } ; {print $4,"is",$8}'

Eu recebo minha saída desejada:

Den Window Sensor is off

No entanto, quando quero que isso seja passado como um parâmetro para um script (que usa $ 1 no script):

./message.sh $(tailf /var/log/z-way-server.log | grep --line-buffered device-info | gawk 'BEGIN { FS = "\"" } ; {print $4,"is",$8}')

Nunca passa a mensagem como desejado? Para esclarecimentos, message.sh Test postaria a palavra "Teste" para um canal do Slack.

    
por armani 23.11.2016 / 06:31

2 respostas

2

O problema é que o comando message.sh nunca é iniciado. O shell primeiro precisa avaliar o comando $(...) para passar o resultado como argumentos, mas você está usando tailf que nunca termina. Compare com isso:

ls $(echo hello;sleep 10) & sleep 1; ps

O ps mostrará que ls não foi iniciado e só obterá o hello arg quando o sleep 10 terminar e a $() terminar.

    
por 23.11.2016 / 10:33
0

tente passar com aspas duplas. e se o seu sistema operacional suportar o comando timeout, tente com o tempo limite (consulte o post abaixo)

link

se você não quiser tempo limite, tente assim

#!/bin/bash

tailf /var/log/z-way-server.log | grep --line-buffered device-info | gawk 'BEGIN { FS = "\"" } ; {print $4,"is",$8}' | while read line
do
    /absolute/path/of/message.sh "${line}"
done
    
por 23.11.2016 / 07:52