curl - CURLOPT_VERBOSE 没有发送到 STDERR
问题描述
Ubuntu 20.04 使用 libcurl 和以下代码,我可以从命令行查看输出。但是,当重定向输出时./run_me 2>&1 > output.log
,cURL 输出仍会显示在屏幕上,并且不会重定向到output.log
文件。
cURL 文档指出CURLOPT_VERBOSE
without 设置CURLOPT_STDERR
应该转到STDERR
. 但是,它似乎没有。
我们如何将 cURL 输出重定向到STDERR
?
CURL* curl = curl_easy_init();
char errBuff[CURL_ERROR_SIZE];
if(curl) {
struct MemoryStruct chunk;
chunk.size = 0;
chunk.memory = calloc(1,sizeof(*chunk.memory));
if ( !chunk.memory ) {
return CURLE_FAILED_INIT;
}
(void)curl_easy_setopt(curl, CURLOPT_URL, url);
(void)curl_easy_setopt(curl, CURLOPT_POST, 1L);
(void)curl_easy_setopt(curl, CURLOPT_USERNAME, username);
(void)curl_easy_setopt(curl, CURLOPT_PASSWORD, password);
(void)curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, CONNECTION_TIMEOUT);
(void)curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
(void)curl_easy_setopt(curl, CURLOPT_CAINFO, trustStore);
(void)curl_easy_setopt(curl, CURLOPT_SSLCERT, clientCert);
(void)curl_easy_setopt(curl, CURLOPT_SSLKEY, clientKey);
(void)curl_easy_setopt(curl, CURLOPT_KEYPASSWD, clientKeyPass);
(void)curl_easy_setopt(curl, CURLOPT_VERBOSE, 1 );
(void)curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errBuff );
errBuff[0] = 0; // empty the error buffer
(void)curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
(void)curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
struct curl_slist* list = NULL;
list = curl_slist_append(NULL, "Content-Type: application/json");
list = curl_slist_append(list, "Accept: application/json");
char clBuf[30];
(void)snprintf(clBuf, 30, "Content-Length: %d", (int)strlen(postData));
list = curl_slist_append(list, clBuf);
(void)curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
(void)curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);
long httpCode = 0;
int res = CURLE_FAILED_INIT;
res = curl_easy_perform(curl);
(void)curl_easy_getinfo(curl, CURLINFO_HTTP_CODE, &httpCode);
}
解决方案
答案与 shell 如何处理重定向的顺序有关。
从 bash 手册:
请注意,重定向的顺序很重要。例如,命令
ls > dirlist 2>&1
将标准输出和标准错误都指向文件 dirlist,而命令
ls 2>&1 > dirlist
仅将标准输出定向到文件 dirlist,因为在将标准输出重定向到 dirlist 之前,标准错误已从标准输出中复制。
将命令更改为./run_me > output.log 2>&1
应该会导致 curl 的详细输出也被重定向到文件。
推荐阅读
- python - 在python中按扩展名对文件路径进行排序
- php - 如果 SKU 在 Magento 2.3 中不可用,则使用另一个标识符创建产品
- apache-spark - 如何使用火花求和大表中两个用户的相互(倒数)时间
- java - 试图了解如何创建一个打开终端并接受参数的 jar 文件
- ruby-on-rails - Rails 教程上的 Rails 测试,ArgumentError
- ionic-framework - android 上的 ionic 应用程序,带有错误消息“检测到 API 兼容性问题”
- python - 如何正确构造一个for循环以循环遍历python列表
- c# - 在带有 RadioButtons 的 UserControl 表单中按下导航键后表单没有响应
- python-3.x - 如何使用 python3 argparse 在特定时间范围内读取和写入 pcap 文件?
- php - 如何在php中计算日期的数字总和?