首页 > 解决方案 > 为什么只有 Perl 反引号执行显示进度条的 curl 命令?

问题描述

我们使用带反引号的 perl 命令来执行 curl,它显示的进度条如下所示:

root@wetraveller:~# perl -e "print `curl http://127.0.0.1:53424/`"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0curl: (7) Failed to connect to 127.0.0.1 port 53424: Connection refused

当我直接执行curl时,它不显示进度条:

root@wetraveller:~# curl http://127.0.0.1:53424/
curl: (7) Failed to connect to 127.0.0.1 port 53424: Connection refused

当我使用系统命令执行 curl 时,它不显示进度条

root@wetraveller:~# perl -e "system('curl http://127.0.0.1:53424/')"
curl: (7) Failed to connect to 127.0.0.1 port 53424: Connection refused

正在执行完全相同的命令,但如果封装在反引号中并由 Perl 执行,则输出是不同的。

那么这是 Perl 还是 Curl 的问题?

我理解使用 -s 选项我们可以抑制输出,我只是好奇为什么输出可能会有所不同?

标签: perlcurl

解决方案


为了捕获孩子打印到其 STDOUT 的内容,反引号将管道与孩子的 STDOUT 相关联。

默认情况下,curl当 STDOUT 不是终端时,将此仪表显示到 STDERR。

$ curl https://pastebin.com/raw/6KdStLY6; echo
A small document

$ curl https://pastebin.com/raw/6KdStLY6 | cat; echo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    16    0    16    0     0     64      0 --:--:-- --:--:-- --:--:--    64
A small document

这样做的原因是在将文件下载到磁盘时提供进度感。

$ curl https://pastebin.com/raw/6KdStLY6 >file; echo done
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    16    0    16    0     0    111      0 --:--:-- --:--:-- --:--:--   111
done

正如您所提到的,这可以通过使用-s命令行选项来防止。

$ curl -s https://pastebin.com/raw/6KdStLY6 >file; echo done
done

推荐阅读