【发布时间】:2011-07-22 14:20:23
【问题描述】:
由于某种原因,输出总是被打印到终端,无论我是通过 2> 或 > 还是 | 重定向它。有没有办法解决这个问题?为什么会这样?
【问题讨论】:
-
如果我这样做
curl -v url 2>&1,错误会正确地重定向到我的标准输出。
由于某种原因,输出总是被打印到终端,无论我是通过 2> 或 > 还是 | 重定向它。有没有办法解决这个问题?为什么会这样?
【问题讨论】:
curl -v url 2>&1,错误会正确地重定向到我的标准输出。
添加-s(静默)选项以删除进度表,然后将 stderr 重定向到 stdout 以获得与响应正文相同的 fd 上的详细输出
curl -vs google.com 2>&1 | less
【讨论】:
2>&1 可能会错过的哪种输出。
--stderr - curl 参数将stderr重定向到stdout。
您的网址中可能包含与号。我也遇到了这个问题,我意识到我的 URL 充满了与号(来自传递的 CGI 变量),因此所有内容都以一种奇怪的方式发送到后台,因此无法正确重定向。如果你在 URL 周围加上引号,它会修复它。
【讨论】:
我发现了同样的事情:curl 本身会打印到 STDOUT,但不能通过管道传输到另一个程序中。
起初,我以为我已经通过使用 xargs 先回显输出来解决它:
curl -s ... <url> | xargs -0 echo | ...
但是,正如 cmets 中所指出的,它也可以在没有 xargs 部分的情况下工作,因此-s(静默模式)是防止无关进度输出到 STDOUT 的关键:
curl -s ... <url> | perl -ne 'print $1 if /<sometag>([^<]+)/'
上面的例子从 curl 语句的 XML 输出中抓取了简单的<sometag> 内容(不包含嵌入的标签)。
【讨论】:
上面的答案对我不起作用,最终是这样的语法:
curl https://${URL} &> /dev/stdout | tee -a ${LOG}
tee 将输出放在屏幕上,但也将其附加到我的日志中。
【讨论】:
&> /dev/stdout 绝对是缺少的部分,谢谢
以下内容对我有用:
将您的 curl 语句放入名为 abc.sh 的脚本中
现在运行:
sh abc.sh 1>stdout_output 2>stderr_output
您将在 stdout_output 中获得 curl 的结果,在 stderr_output 中获得进度信息。
【讨论】:
只有我的 2 美分。 如前所述,下面的命令应该可以解决问题
curl -vs google.com 2>&1
但是如果需要将输出保存到文件中,
curl -vs google.com > out.txt 2>&1
应该可以。
【讨论】:
这个简单的例子展示了如何捕获 curl 输出,并在 bash 脚本中使用它
function main
{
\curl -vs 'http://google.com' 2>&1
# note: add -o /tmp/ignore.png if you want to ignore binary output, by saving it to a file.
}
# capture output of curl to a variable
OUT=$(main)
# search output for something using grep.
echo
echo "$OUT" | grep 302
echo
echo "$OUT" | grep title
【讨论】:
如果您需要输出在文件中,您可以使用重定向:
curl https://vi.stackexchange.com/ -vs >curl-output.txt 2>&1
请务必不要翻转>curl-output.txt和2>&1,因为bash's redirection behavior将不起作用。
【讨论】: