我正在尝试使用从 tshark 通过管道传输到 while 循环的 url。
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)
在循环内部,我可以很好地 echo $line ;它看起来像这样:
http://mywebsite.com/file?eid=5345944&fmt=5&app_id=214748364&range=20-30&etsp=1456777145&hmac=1K9nwkA8TOgtOXAsakSfMMVWsuE
但由于某种原因,我无法在同一个 while 循环内使用同一个“line”变量来提供 ffmpeg。正在做
ffmpeg -i "$line" -c copy "filename"
结果(所有引用均准确复制粘贴)
[http @ 0x1ab5ec0] HTTP error 400 Bad Request:
Server returned 400 Bad Request5345932&fmt=5&app_id=214748364&range=20-30&etsp=1456779359&hmac=35B2lA6D0zfR2DmfdPS4ZcilYxg
另一方面,复制 url(从 echo 输出),双引号它并在终端中使用相同的 ffmpeg 命令效果很好。
此外,由于某种原因,使用 -xv 运行脚本时该命令会被截断,因此它不会显示完整的“+ ffmpeg -i 'http://....”行。
答案1
编辑:看起来 grep 正在捕获换行符或回车符,当您将其作为一次性命令提交时,这很好,但在循环中则不好。添加 tr -d '\r'
答案2
事实证明,grep(或 tshark?)正在将回车符捕获到$line
变量中,正如 Gregg Leventhal 所指出的那样。这个回车需要去掉。
$line
将循环内部替换为$(echo "$line" | tr -d '\r')
对我来说是成功的!