Editar: Parece que o grep está capturando uma nova linha ou um retorno de carro, o que é bom quando você o envia como um comando único, mas não está bem no loop. Adicione tr -d '\ r'
Estou tentando usar um URL enviado do tshark para um loop while.
while read line ; do
echo "$line"
ffmpeg -i "$line" -c copy "filename"
done < <(tshark -i tun0 -B 50 -P -V -q -l -Y 'http matches "(?<=\[Full request URI: )(http://mywebsite.com/file.*)(?=\])"' 2>&1 | grep --line-buffered -Po "(?<=\[Full request URI: )(http://mywebsite.com/file.*)(?=\])" | unbuffer -p uniq)
Dentro do loop, consigo ecoar $ line bem; e parece assim:
http://mywebsite.com/file?eid=5345944&fmt=5&app_id=214748364&range=20-30&etsp=1456777145&hmac=1K9nwkA8TOgtOXAsakSfMMVWsuE
Mas, por algum motivo, não consigo usar essa mesma variável "line" para alimentar o ffmpeg, dentro do mesmo loop while. Fazendo
ffmpeg -i "$line" -c copy "filename"
resulta em (todas as citações são copiadas com precisão)
[http @ 0x1ab5ec0] HTTP error 400 Bad Request:
Server returned 400 Bad Request5345932&fmt=5&app_id=214748364&range=20-30&etsp=1456779359&hmac=35B2lA6D0zfR2DmfdPS4ZcilYxg
Por outro lado, copiar o URL (da saída de eco), duplicá-lo e usar o mesmo comando ffmpeg em um terminal funciona perfeitamente.
Além disso, por algum motivo, o comando é truncado ao executar o script com -xv, de tal forma que ele não mostre a linha completa "+ ffmpeg -i 'http: // ...." como deveria .
Acontece que o grep (ou tshark?) está capturando um retorno de carro na variável $line
, como apontado por Gregg Leventhal. Esse retorno de carro precisa ser retirado.
Substituir $line
dentro do loop por $(echo "$line" | tr -d '\r')
fez o truque para mim!