【发布时间】:2014-11-29 19:58:34
【问题描述】:
我的意图是在下载文件时获取(然后修改)cURL 输出。
curl -# -L --user-agent 'Mozilla/5.0' -o "`echo -e "$filename"`" "$url" 2>&1 |
while true
do
read <&1 line1 line2
echo $line2
if [ "`echo $line2 | grep -o "#"`" = "#" ] ; then
echo "downloading..."
break
elif [ "`echo $line2 | grep -o "curl"`" = "curl" ] ; then
echo $line2
break
else
echo "stderr still empty"
fi
done
问题是 cURL 输出(发送到 stderr)是动态的,所以我认为我必须使用 while true 直到可以读取某些内容,因为如果我在 curl 之后立即通过 while read 进行管道传输,管道是空的。
知道我想直接发送 curl 输出以读取上述构造中的输入。
而且我真的不想使用任何临时文件(我同意这可以很容易地解决这个问题:))
编辑:这是存储在日志中的 stderr 上的 curl 动态 curl 输出:
######################################################################## 100.0%
0.2%
0.5%
1.1%
# 1.6%
# 2.6%
## 3.3%
### 4.6%
#### 6.1%
#### 6.5%
#### 6.8%
##### 7.3%
##### 7.7%
##### 8.0%
##### 8.2%
###### 8.7%
【问题讨论】:
-
...但是
read应该等待缓冲区填满。我可以将 curl 输出直接传送到while read循环,没问题。也许你可以发布你的错误? -
...and what you want achieve? (因为 grepping curl 的进度条不是最好的主意...)
-
我要做的是,首先检查下载是否正确开始,如果curl返回错误,然后(为了简化)将进度条打印为绿色或将错误打印为红色。跨度>
-
我刚刚意识到:在日志的每一行末尾都有一个 ^M (CTRL-M)
-
我设法用
sed $'s/\r/\\\n/g'或tr '\r' '\n' < log > log2转换它们
标签: bash curl while-loop pipe stderr