perl - 为什么只有 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 选项我们可以抑制输出,我只是好奇为什么输出可能会有所不同?
解决方案
为了捕获孩子打印到其 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
推荐阅读
- r - 如何在lda中保留已删除文本的文本ID
- django - 通过邮件通过 html 文件发送表单上下文
- gitlab - 权限被拒绝 - Cpanel - Git 版本控制(私人回购)
- javascript - 谷歌表格脚本缺少一些东西
- python - Python filter() 带有变量的对象列表
- extjs4 - 仅在 Karma 中提供文件的问题
- python - 根据来自不同Dataframe的多个条件删除Dataframe的行
- ruby-on-rails - Is there a way to make a model method in active record?
- javascript - 移动右滑块时,Jquery范围滑块正在改变左滑块的值?
- android - 协调器布局 - 折叠内容交互与回收器视图