如何管道或重定向旋度 v 的输出?

由于某种原因,输出总是被打印到终端,而不管我是否通过2 > 或 > 或 | 重定向它。有办法解决吗?为什么会这样?

273645 次浏览

添加 -s(静默)选项以删除进度表,然后将 stderr 重定向到 stdout 以获得与响应主体相同的 fd 上的详细输出

curl -vs google.com 2>&1 | less

你的 URL 可能有 & 符号。我也有这个问题,我意识到我的 URL 充满了 & 符号(来自传递的 CGI 变量) ,所以所有东西都以一种奇怪的方式被发送到后台,因此没有正确地重定向。如果你在 URL 周围加上引号,它会修复这个问题。

我发现了同样的情况: curl 本身将打印到 STDOUT,但不能通过管道传输到另一个程序。

起初,我以为我已经通过使用 xargs 首先回显输出来解决了这个问题:

curl -s ... <url> | xargs -0 echo | ...

但是,正如在评论中指出的,它也可以在没有 xargs 部分的情况下工作,所以 -s(静默模式)是防止向 STDOUT 输出无关进度的关键:

curl -s ... <url> | perl  -ne 'print $1 if /<sometag>([^<]+)/'

上面的示例从 curl 语句的 XML 输出中获取简单的 <sometag>内容(不包含嵌入式标记)。

上面的答案对我不起作用,最终起作用的是这样的语法:

curl https://${URL} &> /dev/stdout | tee -a ${LOG}

Tee 将输出放在屏幕上,但也将其附加到日志中。

以下几点对我很有效:

将 curl 语句放在名为 abc.sh的脚本中

快跑:

sh abc.sh 1>stdout_output 2>stderr_output

你会得到你的卷发结果在 stdout_output和进度信息在 stderr_output

只有我的两分钱。 如前所述,下面的命令应该可以完成这个任务

curl -vs google.com 2>&1

但是,如果需要将输出文件,

curl -vs google.com > out.txt 2>&1

应该可以。

这个简单的示例演示如何捕获 curl 输出,并在 bash 脚本中使用它

Test.sh

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.txt2>&1,这将不会由于 Bash 的重定向行为工作。

解决方案 = curl-vs google.com 2 > & 1 | less

但是,如果您想将输出重定向到一个文件,并且输出仍然显示在屏幕上,那么 URL 响应包含一个换行字符 n,这会扰乱您的 shell。

为了避免这种情况,将所有内容放在一个变量中:

Result = $(curl-v. . .)